【问题标题】:javafx how to test image equality?javafx如何测试图像相等性?
【发布时间】:2023-12-03 04:13:01
【问题描述】:
for (int i = 0; i < image1Width; i++)
{
  for (int j = 0; j < image1Height; j++)
  {
    if (image1.getPixelReader().getColor(i, j) != image2.getPixelReader().getColor(i, j)) return false;
  }
}

这是我目前所拥有的。我通过函数两个图像(javafx.scene.image.Image)。这意味着当图像相同时,这永远不会返回 false。不幸的是,当我将相同的图像传递给它时,这将返回 false。

谢谢。

【问题讨论】:

    标签: java image javafx equality


    【解决方案1】:

    你需要

    if (!image1.getPixelReader().getColor(i, j).equals(image2.getPixelReader().getColor(i, j))) return false;
    

    if (image1.getPixelReader().getArgb(i, j) != image2.getPixelReader().getArgb(i, j)) return false;
    

    第二个版本可能更快。

    【讨论】:

    • 非常感谢。这解决了这个问题。有趣的是,比较颜色不起作用。
    • 它应该通过比较颜色来工作,只要您使用正确的相等测试。
    • 对,我明白了。 ==/!= 比较值对吗? getColor() 不应该返回一个可以与相同颜色进行比较的值吗?我只是对为什么 ==/!= 不够感兴趣。
    • 不,== 用于引用类型时(Color 是引用类型,int 是原始类型)比较引用。比较引用类型时应该使用.equals(...),除非你有充分的理由不这样做。
    【解决方案2】:

    对于只想复制和粘贴此即用方法的人

    private boolean isImageEqual(Image firstImage, Image secondImage){
        // Prevent `NullPointerException`
        if(firstImage != null && secondImage == null) return false;
        if(firstImage == null) return secondImage == null;
    
        // Compare images size
        if(firstImage.getWidth() != secondImage.getWidth()) return false;
        if(firstImage.getHeight() != secondImage.getHeight()) return false;
    
        // Compare images color
        for(int x = 0; x < firstImage.getWidth(); x++){
            for(int y = 0; y < firstImage.getHeight(); y++){
                int firstArgb = firstImage.getPixelReader().getArgb(x, y);
                int secondArgb = secondImage.getPixelReader().getArgb(x, y);
    
                if(firstArgb != secondArgb) return false;
            }
        }
    
        return true;
    }
    

    【讨论】: