プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

BufferedImageについて

さて、今日はBufferedImageについて。

BufferedImageはデータをビット単位で我々が直接弄ることの出来るImage。


BufferedImageの作り方は表示用なら、コンポーネント内から

BufferedImage img = getGraphicsConfiguration().createCompatibleImage(width,height)

で作成できます。第三引き値に透明度モードを指定すると透明なBufferedImageが作れます。

この作り方だと、内部データの構造がその環境に近い物を作るので表示が若干高速なBufferedImageが作れます。
私の環境ではTYPE_INT_RGBが作成されました。
自分で作る場合もTYPE_INT系を選べばいいと思います。

さて、BufferedImageのイメージデータはsetPixel(s)関数を使う以外にも直接弄ることが出来ます。
上のBufferedImageのimgでは

int[] pixels =((DataBufferInt)img.getRaster().getDataBuffer()).getData();

BufferedImage.TYPE_BYTE系ならDataBufferByteです。


データはTYPE_**_RGBなら赤緑青の順に、TYPE_**_ABGRなら透明度、青、緑、赤の順にInt系なら一つの値に全て、Byte系ならそれぞれ一つずつ入っています。

これで取り出したデータに直接書き込むとBufferedImageを更新することが出来るのですが、若干問題があります。


通常、setPixelとかの関数を使ってBufferedImageを弄っている際にはBufferedImageはJAVAによって管理されていますが、データを直に扱うとJAVAで管理できなくなります。


BufferedImageはJAVAに管理されることによって、2回以上描画処理にBufferedImageが使われると、何度も描画に使われると判断し、BufferedImageをVRAM(ビデオメモリー)にコピーしてくれます。
その為、描画が高速になります。
データが変更されたことを捕らえると、VRAMのデータを書き換えてくれます。
ですから、あまり上記のデータを直接取得はしない方が賢明です。

画像を描画しない、私が現在作成しているペイントソフトの様にしょっちゅう画像が更新されてVRAMに送られても高速化の意味がない、等の場合に限り使いましょう。

以上。あまりWebでBufferedImageについて日本語資料が見つからなかったので書いておきました。