【问题标题】:Apply changes to BufferedImage将更改应用到 BufferedImage
【发布时间】: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


【解决方案1】:

图像仅在保存/加载后相同的原因是因为在那之后,两个图像都受到(有损)jpeg 转换的影响。在此之前,写入 base_image 的文本尚未“转换”。

【讨论】:

  • base image 只是一个背景图,reference_image 是base_image,上面有文字。在我将文本添加到基础图像后,它们都是相同的,但逐像素比较失败,除非我保存图像并重新读取它
  • @turingcomplete 澄清一下,您在base_image 上编写文本,这应该使其与已经有文本的reference_image 相同? identicalImages 设置为 false 时 x 和 y 的值是多少?如果您的像素比较失败,您怎么知道它们是相同的?
  • 是的,你是对的。它们都是相同的,因为 reference_image 的生成方式与我在代码中生成的图像相同。如果我在写入文本然后重新读取后将图像保存到磁盘,则逐像素比较通过。
  • @turingcomplete 我认为图像仅在保存/加载后相同的原因是因为只有在那之后两个图像才受到(有损)jpeg转换的影响。
  • 我同意你的评价@SteveSmith。问题是JPEG有损压缩。 OP 可能想对this answer 中的源代码进行试验,以查看不同级别 JPEG 压缩的效果。
猜你喜欢
  • 2018-03-03
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多