Преобразование строки base64 в изображение

Я пытаюсь обрезать / изменять размер изображения профиля пользователя, используя jQuery plugin, а именно crop.js, который отправляет изображение пользователя в качестве base64 через ajax на мой controller как

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

но я не могу декодировать этот base64

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

string as Image, Можете ли вы, ребята, указать мне, как я могу сохранить свою строку base64 как изображение на моем сервере ?.

6 Solutions collect form web for “Преобразование строки base64 в изображение”

Это предполагает несколько вещей, что вы знаете, что будет именем выходного файла, и что ваши данные поступают в виде строки. Я уверен, что вы можете изменить следующее, чтобы удовлетворить ваши потребности:

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

Обратите внимание, что это всего лишь пример того, какие части задействованы. Я вообще не оптимизировал этот код и списал его с головы.

На сервере сделайте что-нибудь вроде этого:

предполагать

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

Затем:

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

Затем вы можете делать все, что хотите, с байтами:

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

Файлы на стороне сервера / Изображения для base64String готовы для использования на стороне клиента

 public Optional InputStreamToBase64(Optional 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(); } 

Основание на стороне сервера64 Декодер изображения / файла

 public Optional Base64InputStream(Optional base64String)throws IOException { if (base64String.isPresent()) { return Optional.ofNullable(new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(base64String.get()))); } return Optional.empty(); } 
  public Optional InputStreamToBase64(Optional inputStream) throws IOException{ if (inputStream.isPresent()) { ByteArrayOutputStream outpString base64Image = data.split(",")[1]; byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(base64Image); 

Затем вы можете делать все, что хотите, с байтами:

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

ImageIO.write() сжимает изображение по умолчанию – сжатое изображение имеет меньший размер, но иногда выглядит странно. Я использую BufferedOutputStream для сохранения данных байтового массива – это сохранит исходный размер изображения.

Вот код:

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

Привет Это мое решение

Код 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); 

Это мой 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() : ""; } 
  • Представители Java?
  • JFormattedTextField неправильно очищен
  • Как правильно переопределить метод клонирования?
  • Как получить javax.comm API?
  • Обновление пользовательского интерфейса из разных streamов в JavaFX
  • Общие элементы в двух списках
  • Как создать multidimensional array ArrayList в Java?
  • Как отформатировать строку Java с начальным нулем?
  • Рисование простого линейного графика в Java
  • Java - чтение, управление и запись WAV-файлов
  • Регистрация и использование пользовательского протокола java.net.URL
  • Давайте будем гением компьютера.