studio imagen example decodificar convertir convert cadena b64 java ajax image grails base64

java - example - convertir imagen a base64 android studio



Convierte cadena de base64 en imagen (6)

Estoy tratando de recortar / cambiar el tamaño de la imagen del perfil del usuario usando el plugin jquery llamado crop.js que envía la imagen del usuario como base64 a través de ajax a mi controlador como

$.ajax({ type: "post", dataType: "json", url: "${g.createLink(controller: ''personalDetail'', action:''uploadUserImage'')}", data: { avatar: canvas.toDataURL() } });

pero no puedo descifrar esta base64

''data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAgAEl...==''

cadena como Imagen, ¿pueden guiarme cómo puedo guardar mi cadena base64 como imagen en mi servidor ?.


Archivos de codificación del lado del servidor / Images to base64String listos para el consumo del lado del cliente

public Optional<String> InputStreamToBase64(Optional<InputStream> inputStream) throws IOException{ if (inputStream.isPresent()) { ByteArrayOutputStream output = new ByteArrayOutputStream(); FileCopyUtils.copy(inputStream.get(), output); //TODO retrieve content type from file, & replace png below with it return Optional.ofNullable("data:image/png;base64," + DatatypeConverter.printBase64Binary(output.toByteArray())); } return Optional.empty(); }

Descodificador de imagen / archivo base64 del lado del servidor

public Optional<InputStream> Base64InputStream(Optional<String> base64String)throws IOException { if (base64String.isPresent()) { return Optional.ofNullable(new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(base64String.get()))); } return Optional.empty(); }


En el servidor, haz algo como esto:

Suponer

String data = ''data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAgAEl...==''

Entonces:

String base64Image = data.split(",")[1]; byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(base64Image);

Entonces puedes hacer lo que quieras con los bytes como:

BufferedImage img = ImageIO.read(new ByteArrayInputStream(imageBytes));


Esto supone algunas cosas, que usted sabe cuál será el nombre del archivo de salida y que sus datos vienen como una cadena. Estoy seguro de que puede modificar lo siguiente para satisfacer sus necesidades:

// Needed Imports import java.io.ByteArrayInputStream; import sun.misc.BASE64Decoder; def sourceData = ''data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAgAEl...==''; // tokenize the data def parts = sourceData.tokenize(","); def imageString = parts[1]; // create a buffered image BufferedImage image = null; byte[] imageByte; BASE64Decoder decoder = new BASE64Decoder(); imageByte = decoder.decodeBuffer(imageString); ByteArrayInputStream bis = new ByteArrayInputStream(imageByte); image = ImageIO.read(bis); bis.close(); // write the image to a file File outputfile = new File("image.png"); ImageIO.write(image, "png", outputfile);

Tenga en cuenta que esto es solo un ejemplo de qué partes están involucradas. No he optimizado este código en absoluto y está escrito en la parte superior de mi cabeza.


Hola, esta es mi solución

Código Javascript

var base64before = document.querySelector(''img'').src; var base64 = base64before.replace(/^data:image//(png|jpg);base64,/, ""); var httpPost = new XMLHttpRequest(); var path = "your url"; var data = JSON.stringify(base64); httpPost.open("POST", path, false); // Set the content type of the request to json since that''s what''s being sent httpPost.setRequestHeader(''Content-Type'', ''application/json''); httpPost.send(data);

Este es mi código de Java

public void saveImage(InputStream imageStream){ InputStream inStream = imageStream; try { String dataString = convertStreamToString(inStream); byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(dataString); BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes)); // write the image to a file File outputfile = new File("/Users/paul/Desktop/testkey/myImage.png"); ImageIO.write(image, "png", outputfile); }catch(Exception e) { System.out.println(e.getStackTrace()); } } static String convertStreamToString(java.io.InputStream is) { java.util.Scanner s = new java.util.Scanner(is).useDelimiter("//A"); return s.hasNext() ? s.next() : ""; }


ImageIO.write() comprimirá la imagen de forma predeterminada: la imagen comprimida tiene un tamaño más pequeño pero a veces se ve extraño. Yo uso BufferedOutputStream para guardar los datos de la matriz de bytes, esto mantendrá el tamaño de la imagen original.

Aquí está el código:

import javax.xml.bind.DatatypeConverter; import java.io.*; public class ImageTest { public static void main(String[] args) { String base64String = "data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAHkAAAB5C..."; String[] strings = base64String.split(","); String extension; switch (strings[0]) {//check image''s extension case "data:image/jpeg;base64": extension = "jpeg"; break; case "data:image/png;base64": extension = "png"; break; default://should write cases for more images types extension = "jpg"; break; } //convert base64 string to binary data byte[] data = DatatypeConverter.parseBase64Binary(strings[1]); String path = "C://Users//Ene//Desktop//test_image." + extension; File file = new File(path); try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file))) { outputStream.write(data); } catch (IOException e) { e.printStackTrace(); } } }


public Optional<String> InputStreamToBase64(Optional<InputStream> inputStream) throws IOException{ if (inputStream.isPresent()) { ByteArrayOutputStream outpString base64Image = data.split(",")[1]; byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(base64Image);

Entonces puedes hacer lo que quieras con los bytes como:

BufferedImage img = ImageIO.read(new ByteArrayInputStream(imageBytes));ut = new ByteArrayOutputStream(); FileCopyUtils.copy(inputStream.get(), output); //TODO retrieve content type from file, & replace png below with it return Optional.ofNullable("data:image/png;base64," + DatatypeConverter.printBase64Binary(output.toByteArray())); } return Optional.empty();