これまで、画像処理アプリケーションその1、その2でImageクラス、PixelGrabber クラス、MemoryImageSourceクラスについて、取り扱ってきました。画像を処理したい 場合はこの3つがあれば大丈夫だろうと思います。そこでまとめとして、詳しく説明 していきたいと思います。(本当はその1とかその2でやる事ですが…(汗))
Imageクラスとは、どういうものか?というと、オフスクリーンに描画できる領域を 確保するものでした。まずは、Imageクラスを宣言して生成します。
Image image; image = createImage(485,88);//書き方は、createImage(幅,高さ);とする。
そして、これで、オフスクリーンの領域を確保したので次は、画像を読み込みます。
image = Toolkit.getDefaultToolkit().getImage(filename); //これはほんの1例です。(アプリケーションの場合) //アプレットの場合 image = getImage(getDocumentBase(),filename);としてもよい。
次に、PixelGrabberクラスを使ってピクセルごとのデータを取得する。
//PixelGrabberのコンストラクタは(読み取るimage,始点のx座標,始点のy座標,
// 幅,高さ,ピクセルごとの情報を確保するための1次元配列,
// 配列のどこから格納を始めるか,配列1列の長さ);の順番です。
PixelGrabber pg = new PixelGrabber(image,0,0,485,88,pixels,0,485);
try{
pg.grabPixels();//ピクセルの情報を読み出すように指示する。
}catch(InterruptedException e){}
そして、この後は、ピクセルごとに色々な処理を加えます。 ここで、気をつけなければならないのは、ピクセルごとの色情報はRGBカラー値 を32ビットで表現しています。そして、どういう風な状態になっているかと言うと、 0〜7ビット…青の色情報、8〜15ビット…緑の色情報、16〜23ビット…赤の色情報 となってます。これは、気をつけてください。これを間違えると大変な事になります。 ここで、基本のプログラムを書いておきます。
for(int i=0;i<485*88;i++){
int p=pixels[i];//ピクセルの情報を取得
int red = 0xff & (p>>16);//赤の色情報の取得
int green = 0xff & (p>>8);//緑の色情報の取得
int blue = 0xff & p;//青の色情報の取得
//ここでピクセルごとの処理をする
pixels[i] = (0xff000000 | red<<16 | green<<8 | blue);//処理後のピクセルの情報を元に戻す
}
そして、これでピクセルごとの処理が終わったので次にMemoryImageSourceクラスを使って 結果を出力しましょう。色んな方法がありますが、とりあえず、もう1つImageクラスで オフスクリーンを確保しましょう。その後、このように書いてみましょう。
image2 = createImage(new MemoryImageSource(485,88,pixels,0,485)); //MemoryImageSource(幅,高さ,ピクセルごとの情報がある配列,配列のどこから読むか,配列1列の長さ); //の順番です。
これで、画像処理が完成です。今回は分かりやすくしたつもりですが、感想が聞けたらいいな と思います。次は何をテーマにしようかな…。