Java 将更改应用于BuffereImage

Java 将更改应用于BuffereImage,java,awt,bufferedimage,Java,Awt,Bufferedimage,我试图在BuffereImage上写入文本,然后对相同的图像进行逐像素比较。然而,这种比较总是失败的。我的代码如下所示: BufferedImage referenceImage = ImageIO.read(new File("reference.jpg")); BufferedImage image = ImageIO.read(new File("base_image.jpg")); image.createGraphics().drawString("hello

我试图在BuffereImage上写入文本,然后对相同的图像进行逐像素比较。然而,这种比较总是失败的。我的代码如下所示:

    BufferedImage referenceImage = ImageIO.read(new File("reference.jpg"));
    BufferedImage image = ImageIO.read(new File("base_image.jpg"));
    image.createGraphics().drawString("hello world", 10, 10);
    //ImageIO.write(image, "jpg", new File("newimage.jpg"));
    //image = ImageIO.read(new File("newimage.jpg"));
    assertEquals(image.getWidth(), referenceImage.getWidth());
    assertEquals(image.getHeight(), referenceImage.getHeight());
    boolean identicalImages = true;
    for (int x = 0; x < image.getWidth(); x++) {
        for (int y = 0; y < image.getHeight(); y++) {
            if (image.getRGB(x, y) != referenceImage.getRGB(x, y)) {
                identicalImages = false;
            }
        }
    }
    assertTrue(identicalImages);
BufferedImage referenceImage=ImageIO.read(新文件(“reference.jpg”);
buffereImage=ImageIO.read(新文件(“base_image.jpg”);
image.createGraphics().drawString(“hello world”,10,10);
//write(image,“jpg”,新文件(“newimage.jpg”);
//image=ImageIO.read(新文件(“newimage.jpg”);
assertEquals(image.getWidth(),referenceImage.getWidth());
assertEquals(image.getHeight(),referenceImage.getHeight());
布尔值identicalImages=true;
对于(int x=0;x

但是,如果我取消注释这两行注释,代码将按预期工作。我怀疑这与需要冲洗的缓冲器有关。我试图冲洗图像对象,但没有成功。如果有人能告诉我们正在发生什么,以及如何让它工作,而不必将图像写入磁盘,然后再将其读回,那就太棒了。

之所以在保存/加载后图像是相同的,是因为在这之后,两幅图像都受到(有损)jpeg转换的影响。在此之前,写入base#U图像的文本尚未“转换”。

BuffereImage#createGraphics
的结果分配给一个变量,进行绘制,完成后,调用
Graphics#dispose
-不确定是否会产生影响,但你应该养成“处理”你“创建”的内容的习惯如果在前两行中加载相同的文件会发生什么情况?可能您正在绘制的字符串与图像的颜色相同background@TomK基本图像只是背景图像,参考图像是在顶部绘制文本的基本图像。在我将文本添加到基础图像后,它们都是相同的,但是逐像素比较失败,除非我保存图像并重新读取it@turingcomplete当你说它失败时,你的意思是
identicalImages
最终是真的吗?基础图像只是背景图像,参考图像是基础图像,上面画有文本。在我将文本添加到基础图像后,它们都是相同的,但是逐像素比较失败,除非我保存图像并重新读取it@turingcomplete为了澄清,您正在
base\u image
上写入文本,这样应该使其与已经包含文本的reference\u image相同?当
identicalImages
设置为false时,x&y的值是多少?如果像素比较失败,您如何知道它们是相同的?是的,您是正确的。它们都是相同的,因为引用图像的生成方式与我在代码中生成的图像相同。如果我在写入文本后将图像保存到磁盘,然后重新读取,则逐像素比较通过。@turingcomplete我认为保存/加载后图像相同的原因是,只有在保存/加载后,两幅图像才受到(有损)jpeg转换的影响。我同意您的评估@SteveSmith。问题是JPEG有损压缩。OP可能希望在中对源代码进行实验,以查看不同级别JPEG压缩的效果。