2005年11月25日

Javaでブラー効果

Javaでブラー効果をします。

blurneko.jpg
↑にゃ〜ん

今回重要なクラスは

Kernel
BufferedImageOp
ConvolveOp


です。

まず、Kernelを宣言します。
JavaDocによるとKernelとは、

「指定されたピクセルについて、フィルタオペレーションで出力されるイメージ中での位置に対する値の計算に、あるピクセルとその周囲のピクセルがどのように影響するかを記述するマトリックスを定義します。X 原点と Y 原点は、カーネルマトリックスの中で出力値の計算対象となるピクセル位置に対応する要素を示します。」

だそうです。 ……ハイ、意味分かりません。w

この値を変える事でイメージの状態が変化するんですが、僕も詳細はあまりよく分かってません。Burn状態Dark状態になることは確認しました。
自分で色々試してみてください。w

次にConvolveOpKernelを実装します。
JavaDocによると、

「ソースからデスティネーションへの畳み込み演算を実装します。」

だそうです。
簡単にいえばソースイメージをKernelを使って変更するって事だと思います。

で、BufferedImageを宣言します。
ここで重要なのが、

BufferedImage.TYPE_INT_RGB|BufferedImage.TYPE_3BYTE_BGR

ってとこです。

僕の使ったJPEGイメージだとTYPE_INT_RGBだけではエラーが出ます。

java.awt.image.ImagingOpException: Unable to convolve src image

イメージ変換できね〜」って言ってますね。生意気な!

いろいろ調べてみたらKernelやらConvolveOpを使ってのイメージを変換する時、pngやjpgなど種類に依存してしまうようです。

なので、、どのイメージはどのオプションが必要かというのを調べる為に前回紹介したImageDump.zipを使って調べます。

imageinfo.jpg
↑赤いところで囲っているところに注目!

このJPEGはTYPE_3BYTE_BGRってタイプですんで、BufferedImageを宣言するときにこのオプションをつけてやります

植えて紹介した、
BufferedImage.TYPE_INT_RGB|BufferedImage.TYPE_3BYTE_BGR
がその結果です。

ちょっと長くなってしまいましたが、今回ポイントとなるコードをまとめときます。

Kernel kernel = new Kernel(3, 3,
 new float[] {
 1f/9f, 1f/9f, 1f/9f,
 1f/9f, 1f/9f, 1f/9f,
 1f/9f, 1f/9f, 1f/9f}
);

BufferedImageOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);

BufferedImage bufferedImage =
new BufferedImage(
 img.getWidth(),img.getHeight(),
 BufferedImage.TYPE_INT_RGB|BufferedImage.TYPE_3BYTE_BGR);
 op.filter(img, bufferedImage);

arg0.drawImage(bufferedImage, img.getWidth(), 0, this);

です。

BlogBlur.zip
↑今回のソースです。


posted by 1.618 at 21:41| Comment(0) | TrackBack(0) | JavaTips | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。