Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可视化2个BuffereImage的差异_Java_For Loop_Comparison_Bufferedimage_Graphics2d - Fatal编程技术网

Java 可视化2个BuffereImage的差异

Java 可视化2个BuffereImage的差异,java,for-loop,comparison,bufferedimage,graphics2d,Java,For Loop,Comparison,Bufferedimage,Graphics2d,我制作了一个函数,通过制作一个新图像,直观地比较2个BuffereImage的差异,其中第一个图像的每个像素都是循环的,当一个像素等于第二个像素时,在新图像中绘制一个像素 起初,这似乎是工作,但在做了一些功能测试后,我注意到一些东西,这使我现在认为它可能是不正确的。当我为img1输入一个带有水平渐变条的图像,为img2输入相同但垂直偏移的图像时,它完全是为第一个图像的渐变绘制了一个遮罩。但是我认为不应该这样做,因为这些像素不应该匹配 例如,如果我输入2个BuffereImage,如下所示: @@

我制作了一个函数,通过制作一个新图像,直观地比较2个BuffereImage的差异,其中第一个图像的每个像素都是循环的,当一个像素等于第二个像素时,在新图像中绘制一个像素

起初,这似乎是工作,但在做了一些功能测试后,我注意到一些东西,这使我现在认为它可能是不正确的。当我为img1输入一个带有水平渐变条的图像,为img2输入相同但垂直偏移的图像时,它完全是为第一个图像的渐变绘制了一个遮罩。但是我认为不应该这样做,因为这些像素不应该匹配

例如,如果我输入2个BuffereImage,如下所示:

@@@@@@@@    @@@@@@@@
@@@@@@@@    --------
---@---@    ---@---@
@@@----@    @@-----@
@@@@@@@@
@@@@@@@@
-------@
@@@----@
它可能会输出如下所示的掩码/缓冲区图像:

@@@@@@@@    @@@@@@@@
@@@@@@@@    --------
---@---@    ---@---@
@@@----@    @@-----@
@@@@@@@@
@@@@@@@@
-------@
@@@----@
但是,我希望它能输出如下内容:

@@@@@@@@
--------
---@---@
@@-----@
当我看的时候,我看不出哪里出了问题,但似乎在某个地方出了问题。有人知道我的功能出了什么问题吗

public BufferedImage MatchBIMask(BufferedImage img1, BufferedImage img2, Color background, Color match){
    int w = img1.getWidth();
    int h = img1.getHeight();
    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = img.createGraphics();
    g.setColor(background);
    g.fillRect(0, 0, w, h);
    g.setColor(match);

    for (int row=0; row < h; row++){
        for (int col=0; col < w; col++){
            int rgb1 = img1.getRGB(col, row);
            int rgb2 = img2.getRGB(col, row);
            if (rgb1 == rgb2) {
                // Match code here
                g.drawRect(col, row, 0, 0); // Draw pixel
            } 
        }
    }

    return img;
}

我不知道该代码是否考虑了alpha。

您可能有具有不同alpha通道的图像,若要仅比较颜色,请在比较之前尝试使用0x00FFFFFF掩蔽RGB值。若要更快获得更好的帮助,请发布一个,或者包含一个小的(WxH&Kb)我已经更新了我的帖子,我得到了两个BuffereImage来比较,它们只是32x32个AWT屏幕截图@Durandal,谢谢,我不知道怎么做,但是因为我对Java很陌生,如果可能的话,提供一个代码示例来说明如何屏蔽RGB值是非常有用的。如果桌面设置为32位深度,Robot的图像可能有一个alpha通道,但它应该包含一个常量值。所以这很可能不是你的问题。在我前面的评论中,屏蔽意味着确保在比较中不考虑alpha通道,在代码中,这将被写成(rgb1&0x00FFFFFFF)==(rgb2&0x00FFFFFF),而不是rgb1==rgb2。但是我相信这并没有造成你的问题。我之前的评论中有一个输入错误,左边的值包含一对多的“F”。两侧应为0x00 FF(六个F)。但是,我仍然认为,当你使用Robot获取图像时,你的问题不是由alhpa通道引起的。