二进制数据图像转换不等于同一图像的 jpg

binary data image conversion does not equal jpg of the same image

我正在尝试比较位于 MP3 文件中的嵌入图像与另存为 JPG 的完全相同的图像。如果图像相同,那么我想执行一些进一步的处理,但是,当我比较 2 个图像(RGB 比较)时,我总是出错。

我确信图像是相同的,因为我从同一个 MP3 中提取图像以使用以下代码最初创建 JPG。

Artwork aw = tag.getFirstArtwork();

ByteArrayInputStream bis = new ByteArrayInputStream(aw.getBinaryData());
BufferedImage imgA = ImageIO.read(bis);

File outputfile = new File("expectedImage.jpg");
ImageIO.write(imgA, "jpg", outputfile);


在我 运行 获取图像之后,我刚刚注释掉了该部分,现在我有以下代码来比较 MP3 嵌入图像与 JPG

提取MP3图片调用比较方法

try {
    Artwork aw = tag.getFirstArtwork();

    ByteArrayInputStream bis = new ByteArrayInputStream(aw.getBinaryData());
    BufferedImage imgA = ImageIO.read(bis);

    File expectedImageFile = new File("expectedImage.jpg");
    BufferedImage imgB = ImageIO.read(expectedImageFile);

    if(compareImages(imgA, imgB)) {
        System.out.println("The Images Match.");
    }else {
        System.out.println("The Images Do Not Match.");
    }
} 
catch (IOException e) {
    e.printStackTrace();
}


比较图像
在第一次通过循环比较像素是否相等时,该方法失败。

public static boolean compareImages(BufferedImage imgA, BufferedImage imgB) {

    // The images must be the same size.
    if (imgA.getWidth() != imgB.getWidth() || imgA.getHeight() != imgB.getHeight()) {
        return false;
    }

    int width = imgA.getWidth();
    int height = imgA.getHeight();

    // Loop over every pixel.
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {

            // Compare the pixels for equality.
            if (imgA.getRGB(x, y) != imgB.getRGB(x, y)) {
                return false;
            }
        }
    }

    return true;
} 

我试过你的代码并阅读了 @Sami Kuhmonen 评论,我明白了。

当您使用 ImageIO.write(imgA, "jpg", outputfile) 时,您会经过另一个编码器,您可能会丢失数据。

您需要通过标准技术更改它。

示例 [更新]

public static void main(String[] args) {

    try {
        //Write the picture to BAOS
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
        byteBuffer.write(aw.getBinaryData(), 0, 1);

        //New file target
        File outputfile = new File("expectedImage.jpg");
        OutputStream outputStream = new FileOutputStream(outputfile);
        byteBuffer.writeTo(outputStream);
        outputStream.close();


        File expectedImageFile = new File("expectedImage.jpg");

        ByteArrayInputStream bis = new ByteArrayInputStream(aw.getBinaryData());
        BufferedImage imgA = ImageIO.read(bis);
        FileInputStream fis = new FileInputStream(expectedImageFile);
        BufferedImage imgB = ImageIO.read(fis);

        if(compareImages(imgA, imgB)) {
            System.out.println("The Images Match.");
        }else {
            System.out.println("The Images Do Not Match.");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }


}

public static boolean compareImages(BufferedImage imgA, BufferedImage imgB) {

    // The images must be the same size.
    if (imgA.getWidth() != imgB.getWidth() || imgA.getHeight() != imgB.getHeight()) {
        return false;
    }

    int width = imgA.getWidth();
    int height = imgA.getHeight();

    // Loop over every pixel.
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {

            // Compare the pixels for equality.
            if (imgA.getRGB(x, y) != imgB.getRGB(x, y)) {
                return false;
            }
        }
    }

    return true;
}

最近有点忙,但今天终于有机会回顾一下,根据上面所说的,我认为主要问题是在一种情况下图像被压缩了,另一方面不是。我确信有一个更好的解决方案,但一个快速的肮脏修复是只保存我想要检查的图像的临时 JPEG 版本,然后使用 2 个缓冲图像进行比较,其中一个读取我拥有的 JPEG 文件保存到目录和读取我刚刚创建的临时 JPEG 的目录,测试完成后只需使用 File.delete() 删除临时文件。

提取MP3图片调用比较方法
比较方法同原先所述

Artwork aw = tag.getFirstArtwork();
ByteArrayInputStream bis = new ByteArrayInputStream(aw.getBinaryData());

BufferedImage tempImg = ImageIO.read(bis);

File tempFile = new File("temp.jpg");
ImageIO.write(tempImg, "jpg", tempFile);

BufferedImage imgA = ImageIO.read(tempFile);

File expectedImageFile = new File("imgToCheckAgainst.jpg");
BufferedImage imgB = ImageIO.read(expectedImageFile);

if(compareImages(imgA, imgB)) {
    System.out.println("The Images Match");
}else {
    System.out.println("The images do not match.");
}

tempFile.delete();