将Data-URL转换为BufferedImage

Dan*_*iel 14 java bufferedimage data-url javax.imageio

我有一个来自图像文件的数据URL,必须将其传递给另一个函数.沿着从Data-URL到BufferedImage的这条路径,它需要是一个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();
}
Run Code Online (Sandbox Code Playgroud)

问题是,它总是抛出UnknownImageFormatException异常,这意味着inputImage为null,这意味着,ImageIO.read无法识别imagetype.

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

Supported Formats: 
jpg, BMP, bmp, JPG, jpeg, wbmp, png, JPEG, PNG, WBMP, GIF, gif
Run Code Online (Sandbox Code Playgroud)

我尝试传递的dataURL就像:data:image/png;base64,...data:image/jpg;base64,...

据我了解,这些都在受支持的文件列表中,因此应该得到认可.

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

Chr*_*phT 21

正如评论所说,图像数据是Base64编码的.要检索二进制数据,您必须删除类型/编码标头,然后将Base64内容解码为二进制数据.

String encodingPrefix = "base64,";
int contentStartIndex = dataUrl.indexOf(encodingPrefix) + encodingPrefix.length();
byte[] imageData = Base64.decodeBase64(dataUrl.substring(contentStartIndex));
Run Code Online (Sandbox Code Playgroud)

我使用org.apache.commons.codec.binary.Base64apache common-codec,其他Base64解码器也应该可以工作.

  • 从Java 8开始,核心JDK中有一个Base64编码器/解码器:http://download.java.net/jdk8/docs/api/java/util/Base64.html (7认同)

Rom*_*nko 9

RFC2397字符串的唯一一个问题是其规范,其中包含数据之前的所有内容,但data:也包含,可选内容:

data:[<mediatype>][;base64],<data>
Run Code Online (Sandbox Code Playgroud)

因此,纯Java 8解决方案的计费方式为:

final int dataStartIndex = dataUrl.indexOf(",") + 1;
final String data = dataUrl.substring(dataStartIndex);
byte[] decoded = java.util.Base64.getDecoder().decode(data);
Run Code Online (Sandbox Code Playgroud)

当然应该检查dataStartIndex。