java – 将数据URL转换为BufferedImage

我有一个图像文件的数据URL,必须将其传递给另一个功能.沿着Data-URL到Buffered Image的路径,它需要是一个byteArray.

我的做法如下:

String dataUrl;
byte[] imageData = dataUrl.getBytes();

// pass the byteArray along the path

// create BufferedImage from byteArray
BufferedImage inputimage = ImageIO.read(new ByteArrayInputStream(imageData));

// If the picture is null,then throw an unsupported image exception.
if (inputimage == null) {
    throw new UnkNownImageFormatException();
}

问题是,它总是抛出UnkNownImageFormatException异常,这意味着inputimage为null,这意味着ImageIO.read不能识别imagetype.

我使用ImageIO.getReaderFormatNames()获取支持文件名,并获得以下列表:

Supported Formats: 
jpg,BMP,bmp,JPG,jpeg,wbmp,png,JPEG,PNG,WBMP,GIF,gif

我尝试传递的dataURL类似于:data:image / png; base64,…或data:image / jpg; base64,…

据我所知,那些在支持文件列表中,应该被认可.

在这种情况下,还可能导致inputimage为null?更有趣的是,我该如何解决呢?

解决方法

由于评论已经说过,图像数据是Base64编码的.要检索二进制数据,您必须剥离类型/编码头,然后将Base64内容解码为二进制数据.
String encodingPrefix = "base64,";
int contentStartIndex = dataUrl.indexOf(encodingPrefix) + encodingPrefix.length();
byte[] imageData = Base64.decodeBase64(dataUrl.substring(contentStartIndex));

我使用来自apaches common-codec的org.apache.commons.codec.binary.Base64,其他的Base64解码器也应该工作.

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...