最初の画像の各ピクセルがループされる新しい画像を作成し、ピクセルが新しい画像のピクセルを描く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
ただし、そのコードがアルファを考慮しているかどうかはわかりません。