2

可能な限り迅速にピクセル値を設定するために、タイプの基礎を使用しようとしてDataBufferByteいます。BufferedImageTYPE_3BYTE_BGR

多分私は理解していないかもしれませんが、次のことを行うと...

byte[] imgBytes = ((DataBufferByte) img.getData().getDataBuffer()).getData();

...参照ではなく、バイト[]のコピーを取得しているようです。たとえば、私が実行すると...

System.out.println(System.identityHashCode(imgBytes));
System.out.println(System.identityHashCode((DataBufferByte) img.getData().getDataBuffer()).getData());

... 2 つの明らかに異なるオブジェクト ハッシュを取得します。私が間違っていなければ、これは基になる byte[] への参照ではなく、コピーを取得していることを示しています。この場合、どうすればDataBufferByte直接編集できますか???

または、ピクセルを間違って設定しているだけかもしれません... imgBytes にピクセルを設定すると、BufferedImage に対して何もしないようです。byte[] を取得したら、次のように各ピクセル値を設定します。

imgBytes[intOffset] = byteBlue;
imgBytes[intOffset+1] = byteGreen;
imgBytes[intOffset+2] = byteRed;

私には、これで問題ないように思えます。この方法でピクセルをうまく読み取ることができるので、同じ方法でピクセルを書き込むことができるはずです!

4

3 に答える 3

3

私も同じ問題を抱えていました。getData() は使用できませんが、書き込みに使用できる配列を提供する getRaster() を使用できます。

于 2015-12-09T15:16:53.490 に答える
1

Javaで画像のピクセル操作をいじったことがあります。あなたの質問に直接答える代わりに、あなたの問題に対する別の解決策を提供します。次のようにして、操作するピクセルの配列を作成できます。

final int width = 800;
final int height = 600;
final int[] pixels = new int[width * height]; // 0xAARRGGBB
MemoryImageSource source = new MemoryImageSource(width, height, pixels, 0, width);
source.setAnimated(true);
source.setFullBufferUpdates(true);
Image image = Toolkit.getDefaultToolkit().createImage(source);
image.setAccelerationPriority(1f);

次に、Graphics クラスからdrawImageメソッドを呼び出すだけで、画像を描画できます。

探しているものを実現する方法は他にもいくつかありますが、この方法が私にとって最も簡単でした。

于 2012-11-11T03:00:34.417 に答える