我有一个来自图像文件的Data-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是空的,这意味着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为空?更有趣的是,我该如何解决它呢?
发布于 2013-11-22 23:19:03
正如评论所说,图像数据是Base64编码的。要检索二进制数据,您必须剥离类型/编码标头,然后将Base64内容解码为二进制数据。
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解码器应该也能工作。
发布于 2016-09-24 01:11:55
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。
发布于 2019-11-13 23:11:26
我认为,一个简单的正则表达式替换会更好,更符合RFC2397
java.util.Base64.getDecoder().decode(b64DataString.replaceFirst("data:.+,", ""))
RFC声明data:和,是数据url所需的前缀,因此对它们进行匹配是明智的。
https://stackoverflow.com/questions/18569591
复制相似问题