首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据-URL转换为BufferedImage

将数据-URL转换为BufferedImage
EN

Stack Overflow用户
提问于 2013-09-02 17:17:26
回答 3查看 13.6K关注 0票数 18

我有一个来自图像文件的Data-URL,必须将它传递给另一个函数。沿着这条从Data-URL到BufferedImage的路径,它需要是一个byteArray。

我的方法如下:

代码语言:javascript
复制
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是空的,这意味着ImageIO.read不能识别imagetype。

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

代码语言:javascript
复制
Supported Formats: 
jpg, BMP, bmp, JPG, jpeg, wbmp, png, JPEG, PNG, WBMP, GIF, gif

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

据我所知,这些都在支持的文件列表中,因此应该得到认可。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-22 23:19:03

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

代码语言:javascript
复制
String encodingPrefix = "base64,";
int contentStartIndex = dataUrl.indexOf(encodingPrefix) + encodingPrefix.length();
byte[] imageData = Base64.decodeBase64(dataUrl.substring(contentStartIndex));

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

票数 24
EN

Stack Overflow用户

发布于 2016-09-24 01:11:55

RFC2397字符串唯一的一个问题是它的规范中除了data:,之外的所有数据都是可选的:

代码语言:javascript
复制
data:[<mediatype>][;base64],<data>

因此,纯Java 8解决方案记帐应该是:

代码语言:javascript
复制
final int dataStartIndex = dataUrl.indexOf(",") + 1;
final String data = dataUrl.substring(dataStartIndex);
byte[] decoded = java.util.Base64.getDecoder().decode(data);

当然,应该检查dataStartIndex。

票数 11
EN

Stack Overflow用户

发布于 2019-11-13 23:11:26

我认为,一个简单的正则表达式替换会更好,更符合RFC2397

java.util.Base64.getDecoder().decode(b64DataString.replaceFirst("data:.+,", ""))

RFC声明data:,是数据url所需的前缀,因此对它们进行匹配是明智的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18569591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档