繁体   English   中英

Base64编码的图像与保存的图像不同

[英]Base64 encoded image is different from what was saved

我使用ImageIOBase64图像字符串保存到文件中:

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,所以这不是失败的原因。

您正在对base64解码字符串,使用ImageIO创建BufferedImage,将其转换回PNG,然后重新对结果进行base64编码。

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文件,这些文件看起来相同,但是编码方式不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM