我使用ImageIO
将Base64
图片字符串保存到文件中:
public static String decodeBase64AndSaveImage(String data) throws IOException, BadRequestException {
try {
if (data == null) {
return null;
}
String base64Image = data.split(",")[1];
byte[] imageBytes = DatatypeConverter.parseBase64Binary(base64Image);
BufferedImage img = ImageIO.read(new ByteArrayInputStream(imageBytes));
String imageId = generateRandomKey(15);
ImageIO.write(img, "png", getImageFile(imageId));
return imageId;
} catch (IllegalArgumentException e) {
throw new BadRequestException("Bad image data");
}
}
我将以下字符串传递给此方法:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAADklEQVQIW2NgQAXGZHAAGioAza6+Hk0AAAAASUVORK5CYII=
在下面的测试中,我检查文件中保存的内容是否与传递给方法的内容相同:
byte[] base64ImageData = Base64.encodeBase64(FileUtils.readFileToByteArray(imageFile));
Assert.assertEquals("wrong image data stored", DUMMY_IMAGE
.split(",")[1], new String(base64ImageData,
StandardCharsets.UTF_8));
但它返回一个不同的字符串:
iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAADklEQVR42mNgQAXGZHAAGioAzTktUZoAAAAASUVORK5CYII=
为什么会这样?
注1
它不会比较data:image/png;base64,
所以它不是它失败的原因。
答案 0 :(得分:4)
你是base64对字符串进行解码,使用ImageIO创建BufferedImage,将其转换回PNG,并对此结果进行重新编码。
byte[] imageBytes = DatatypeConverter.parseBase64Binary(base64Image);
BufferedImage img = ImageIO.read(new
ByteArrayInputStream(imageBytes));
String imageId = generateRandomKey(15);
// re-encode
ImageIO.write(img, "png", getImageFile(imageId));
一切正常。但是图像编码器以与原始图像略有不同的方式对图像进行编码。它们都是有效的PNG文件和有效的base64字符串。
我解码了两个字符串,发现它们生成的有效PNG文件看起来完全一样,但是以不同的方式编码。