0

最初の画像の各ピクセルがループされる新しい画像を作成し、ピクセルが新しい画像のピクセルを描く2番目の画像と等しい場合に、2つのBufferedImageの違いを視覚的に比較する関数を作成しました。

最初はこれが機能しているように見えましたが、関数を使用していくつかのテストを行った後、間違っている可能性があることに気付きました。img1の水平グラデーションバーとimg2の垂直オフセットが同じである画像を入力すると、最初の画像からグラデーションのマスクが完全にペイントされました。ただし、それらのピクセルが一致してはならないため、そうすべきではないと思います。

たとえば、次のように 2 つの BufferedImage を入力した場合:

@@@@@@@@    @@@@@@@@
@@@@@@@@    --------
---@---@    ---@---@
@@@----@    @@-----@

次のような mask/BufferedImage を出力する場合があります。

@@@@@@@@
@@@@@@@@
-------@
@@@----@

ただし、代わりに次のようなものを出力することを期待していました。

@@@@@@@@
--------
---@---@
@@-----@

私がそれを見ると、どこが間違っているのかわかりませんが、どこかに問題があるようです。私が自分の機能で何が間違っていたか知っている人はいますか?

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;
}

編集:

比較する 2 つの BufferedImages を取得する方法は、次のコードを使用することです。

BufferedImage img = robot.createScreenCapture(new Rectangle(x, y, w, h)); // Rectangle Area

ただし、そのコードがアルファを考慮しているかどうかはわかりません。

4

0 に答える 0