【问题标题】:Convert Data-URL to BufferedImage将 Data-URL 转换为 BufferedImage
【发布时间】:2013-09-05 08:22:02
【问题描述】:

我有一个来自图像文件的数据 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();
}

问题是,它总是抛出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 为空?更有趣的是,我该如何解决?

【问题讨论】:

  • 您需要将字符串从 base64 解码回 ImageIO 可以读取的二进制格式,或者,如果您有一个 URL 对象,可以将其直接传递给 ImageIO
  • 根据@MadProgrammer 的建议,您可以使用DatatypeConverter 将base 64 字符串转换回byte[]。

标签: java bufferedimage javax.imageio data-url


【解决方案1】:

正如 cmets 已经说过的,图像数据是 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 解码器也应该可以工作。

【讨论】:

【解决方案2】:

RFC2397 字符串的唯一问题是它的规范,所有内容都在数据之前,但 data: 和 , 可选:

data:[<mediatype>][;base64],<data>

所以纯粹的 Java 8 解决方案将是:

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

当然应该检查 dataStartIndex。

【讨论】:

    【解决方案3】:

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

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

    RFC 声明 data: 和 , 是数据 url 的必需前缀,因此匹配它们是明智的。

    【讨论】:

      猜你喜欢
      • 2013-08-10
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 2017-02-19
      • 1970-01-01
      相关资源
      最近更新 更多