Java 将更改应用于BuffereImage
我试图在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
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压缩的效果。