【发布时间】:2017-12-03 03:45:34
【问题描述】:
我正在尝试在 BufferedImage 上写入文本,然后与相同图像进行逐像素比较。但是,比较总是失败。我的代码如下所示:
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#createGraphics的结果赋值给一个变量,做你的画,当你完成后,调用Graphics#dispose- 不确定是否会有所作为,但你应该养成“处置”你“创造”的东西 -
如果在前两行加载同一个文件会怎样?
-
可能你画的字符串和图片背景颜色一样
-
@TomK 基本图像只是背景图像,reference_image 是在顶部绘制文本的基本图像。在我将文本添加到基础图像后,它们都是相同的,但逐像素比较失败,除非我保存图像并重新读取它
-
@turingcomplete 当你说它失败时,你的意思是
identicalImages到底是真的吗?
标签: java awt bufferedimage