将base64字符串转换为图像
回答 9
浏览 21.5万
2014-06-01
我试图使用jquery插件即crop.js来裁剪/调整用户的个人资料图片,该插件通过ajax将用户图片以base64格式发送到我的控制器中,以作为
$.ajax({
type: "post",
dataType: "json",
url: "${g.createLink(controller: 'personalDetail', action:'uploadUserImage')}",
data: { avatar: canvas.toDataURL() }
});
但我无法对这个base64进行解码。
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAgAEl...=='
字符串为图像,你们能指导我如何在我的服务器上把我的base64字符串保存为图像吗?
你可以在编码后的字符串
iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAgAEl
上直接使用decodeBase64()
,以获得字节数组,然后按答案所示创建文件。
- dmahapatro 2014-06-01
9 个回答
#1楼
得票数 89
在服务器中,做类似这样的事情。
假设
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));
这个 "javax.xml.bind.DatatypeConverter.parseBase64Binary "比使用".getBytes() "方法从一个字符串中获得更好的效果。
- Kyo Huu 2019-05-06
#2楼
已采纳
得票数 71
这有几个假设,你知道输出的文件名是什么,而且你的数据是以字符串形式出现的。我相信你可以修改以下内容以满足你的需要。
// 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);
请注意,这只是一个涉及哪些部分的例子。我根本没有对这段代码进行优化,它是在我头脑中写出来的。
@Lucky Groovy不要求在行尾有分号。
- Joshua Moore 2015-05-30
如果你打算使用JDK > 8,那么这段代码将无法工作,因为Base64Decoder在JDK 8中无法访问。我更喜欢使用javax.xml.bind.DatatypeConverter而不是Base64Decoder或sun.***包中的任何类。
- Sudhir Dhumal 2016-05-01
ImageIO.write()
将默认压缩图像,压缩后的图像尺寸较小,但有时看起来很奇怪。我使用BufferedOutputStream
来保存字节数组的数据,这将保持原始图像的大小。
- Ayano 2017-08-10
@Ayano 我如何做到这一点?
- Jerry U 2018-07-13
#3楼
得票数 27
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();
}
}
}
#4楼
得票数 9
简单性是指。
import java.util.Base64;
要解读。
byte[] image = Base64.getDecoder().decode(base64string);
要进行编码。
String text = Base64.getEncoder().encodeToString(imageData);
#5楼
得票数 5
服务器端将文件/图片编码为base64String,准备供客户端使用。
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();
}
服务器端的base64图像/文件解码器
public Optional<InputStream> Base64InputStream(Optional<String> base64String)throws IOException {
if (base64String.isPresent()) {
return Optional.ofNullable(new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(base64String.get())));
}
return Optional.empty();
}
#6楼
得票数 4
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);
那么你就可以对这些字节做任何你想做的事,比如。
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();
#7楼
得票数 2
嗨,这是我的解决方案
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() : "";
}
#8楼
得票数 0
这是Ayano的优秀答案,但用的是Clojure语言。
(:import (java.awt.image BufferedImage)
(javax.xml.bind DatatypeConverter)
(java.io File BufferedOutputStream FileOutputStream))
(defn write-svg-encountered-image [svg-img-data base-filename]
(let [[meta img-data] (str/split svg-img-data #",")
extension (case meta
"data:image/jpeg;base64" ".jpeg"
"data:image/png;base64" ".png"
(throw (Error. (format "Unrecognised image metadata in SVG:" meta))))
path (str base-filename extension)
file (File. path)
data-bytes (DatatypeConverter/parseBase64Binary img-data)
os (BufferedOutputStream. (FileOutputStream. file))]
(.write os data-bytes)))
#9楼
得票数 -1
To Convert all file types
String[] strings = expense.getAttchBase64().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;
case "data:application/pdf;base64":
extension = "pdf";
break;
case "data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64":
extension = "docx";
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 fileName = UUID.randomUUID().toString();
String path = "C:\\floridatrading\\" + fileName + "." + extension;
File file = new File(path);
try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file))) {
outputStream.write(data);
} catch (IOException e) {
e.printStackTrace();
}
如果你需要添加任何新的类型,只需在switch中添加它即可。