Arian
Arian

Reputation: 7749

Base64 encoded image is different from what was saved

I use ImageIO to save Base64 image string to a file:

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");
    }
}

I pass the following string to this method:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAADklEQVQIW2NgQAXGZHAAGioAza6+Hk0AAAAASUVORK5CYII=

In the following test I check that the if the saved content to the file is the same as what was passed to the method:

        byte[] base64ImageData = Base64.encodeBase64(FileUtils.readFileToByteArray(imageFile));
        Assert.assertEquals("wrong image data stored", DUMMY_IMAGE
                .split(",")[1], new String(base64ImageData,
                StandardCharsets.UTF_8));

But it returns a different string:

iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAADklEQVR42mNgQAXGZHAAGioAzTktUZoAAAAASUVORK5CYII=

Why does this happen ?

Note 1

It doesn't compare data:image/png;base64, so it's not the reason that it fails.

Upvotes: 1

Views: 972

Answers (1)

slipperyseal
slipperyseal

Reputation: 2778

You are base64 decoding the string, using ImageIO to create a BufferedImage, converting it back to a PNG, and re-base64 encoding this result.

byte[] imageBytes = DatatypeConverter.parseBase64Binary(base64Image);
BufferedImage img = ImageIO.read(new 
   ByteArrayInputStream(imageBytes));
String imageId = generateRandomKey(15);

// re-encode
ImageIO.write(img, "png", getImageFile(imageId));

This all works fine. But the image encoder is encoding the image in a slightly different way to the original. They are both though valid PNG files and both valid base64 strings.

I decoded both strings and found they produced valid PNG files which look identical, but were encoded in different ways.

Upvotes: 4

Related Questions