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();