ピクセルデータの取得に問題があります。バイト配列からピクセル値を取得する
私のプログラムはスクリーンショットを取得します。ループするたびに前のスクリーンショットが保存されます。
私の目標は、現在のスクリーンショットと以前のスクリーンショットの間のピクセルレベルで比較を行うことです。
アイブ氏は私に語ったこのコードを実行したスクリーンショットはしているどのような形式: System.out.println(image.getType());
(私のプログラムのための)これの出力である1を意味し、そのIVEは、種類が読んだものから、BufferedImage.TYPE_INT_RGB
ピクセル値がバイト配列内のどの順番であるかを決定します。
私は(バッファリングされたイメージがawt.Robotクラスを使用して作成された)バイト配列に私のバッファリングされたイメージを変換するには、このコードを使用しています:
public byte[] convertToByteArray(BufferedImage img){
byte[] imageInByte = null;
try {
// convert BufferedImage to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
baos.flush();
imageInByte = baos.toByteArray();
baos.close();
} catch (IOException ex) {
Logger.getLogger(OverlayWindow.class.getName()).log(Level.SEVERE, null, ex);
}
return imageInByte;
}
は最終的に私はバイト配列を確認するために、比較メソッドを使用します。今のところこれが唯一の配列のカラー値を出力します。このコードで
final byte[] pixels = convertToByteArray(image);
final int pixelLength = 3;
for (int pixel = 0, row = 0, col = 0; pixel < 1; pixel += pixelLength) {
int argb = 0;
argb += -16777216; // 255 alpha
argb += ((int) pixels[pixel] & 0xff); // blue
argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green
argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red
int r = (argb >> 16) & 0xff, g = (argb >> 8)& 0xff, b = argb & 0xff;
System.out.println("R = " + r);
System.out.println("G = " + g);
System.out.println("B = " + b);
col++;
if (col == width) {
col = 0;
row++;
}
}
私の問題は、私はソリッドカラーのスクリーンショットを撮るにもかかわらず、ピクセル値があらゆる場所にあるということです。私は各ピクセルが同じ色の値を持つことを期待しています。
-Edit-
私は、パフォーマンス上の理由のgetRGBを使用して避けています。毎回getRGBを呼び出す2つの大きな画像を反復することは、私のアプリケーションでは非常にコストがかかります。
私たちは何が起こるか分からないでしょう - あなたはあなたがしているすべての詳細を備えた完全な実行プログラムを持っていますか? – gpasch
まず、 'pixels'は実際にはピクセル値ではなく、圧縮されたPNGファイルのバイトです...それで問題はありません。次に、別のR、G、Bのサンプル(コードで想定しているもの)としてピクセル値を取得している場合は、それらを32ビットのARGB形式にパックしてもう一度解凍してみてください。最初に 'int argb = image.getRGB(x、y);'を使い、すでに行ったようにR、G、Bに分割することをお勧めします。それで、それが十分に速くない場合、そこから最適化してください... – haraldK
私は私の質問を更新しました。だからバイト配列は問題ですか?私はバイト配列を最初に取得しようとしました: '((DataBufferByte)bufferedImage.getData()。getDataBuffer())。getData();'これを実行しようとすると、次のエラーがスローされます: 'java.lang.ClassCastException :java.awt.image.DataBufferIntはjava.awt.image.DataBufferByte'にキャストできません。したがって、ピクセル比較のためにバイト配列を取得する適切な方法は何でしょうか? – user3712476