Androidでモザイク画像を作ってみる

By daichi1128
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

モザイク
今日はAndroidでモザイク画像を作ってみます。
モザイク画像を作るためには

  • Androidで画像のピクセルデータをいじる方法
  • 画像のモザイク加工アルゴリズム

この2つが分かればできそうです。

Androidで画像のピクセルデータをいじる方法

Androidで画像を扱う場合は、android.graphics.Bitmapクラスを使います。
前回にも登場しましたが、カメラから画像を受け取る時に、カメラのコールバックにJpegPictureCallBack等を呼ぶようにして、

などとすれば、Bitmapデータが取得できます。
BitmapクラスはARGB(alpha, red, green, blue)の形式でデータを持っています。

ピクセルデータの取得は

設定するには

のようにすれば、横x、縦yピクセルの値をいじくり倒すことができます。

Colorクラスはargb値から0xff000000等へ変換してくれる便利クラスだと思ってください。
例えば、

のように、RGB値に分解して取得したり、設定したりできます。

あとは、これらを使ってピクセルデータを操作するわけですが、まだ1つ問題があります。
上述したBitmapFactoryから生成されたBitmapはimmutableなものらしく、setPixelを呼ぶとエラーになる作りになっている様子。
mutableなインスタンスはbitmap.copy(Bitmap.Config, boolean)でインスタンスをコピーしなければならないらしいです。
#ここはもっとよい方法があるかもしれません。

copyメソッドの第一引数に、Bitmap.Config.ARGB_8888とすると32ビットのARGBデータ(alpha, red, green, blueそれぞれ0~255)を指定でき、copyメソッドの第二引数に、trueを渡すとmutableなインスタンスをコピーしてくれるようになります。

また、カメラから取得した画像をそのまま使用すると、あっけなくOut Of Memoryで落ちてしまいます。
なので、取得前にリサイズしてその画像を使うことにします。

最終的に前準備も含めた操作メソッドの中身はこのようになります。

以下のあたりでリサイズをしてます。これだと横1/8、縦1/8に縮小されます。

画像のモザイク加工アルゴリズム

あとはモザイクにする処理を書いてやればよいわけですが、先にコードを書いてしまうと以下のようになります。

ピクセルデータを扱うループ近辺にだけ着目してください。

まずはじめにモザイクの大きさをint dot = 4で定義してます。これから4×4のモザイク画像になるイメージです。

次にループ回数を縦横それぞれ、dotで割った値を使っていますが、これはモザイクの切り替わり部分を扱うためです。
モザイク部分には同じピクセル値をセットしていくので、その部分を外のループでカットしてます。

モザイク部分の色は、dot x dot四方の平均色を使うようにしました。
それぞれRGBそれぞれrr, gg,bbとしてdot x dot四方の色の和を求めてから、面積で割ることで平均値をとっています。

最後に求めた平均色でdot x dotのエリアの色をセットしてます。

こんな感じでできあがりです。

リラックマ

リラックマ

 
モザイクマ

モザイクマ

関連する投稿


  1. 歩美 より:

    始めまして。
    現在4年生で、卒業論文のテーマでAndroidのアプを作ろうとしております。

    アプリを作るにあたって、こちらの「Androidでモザイク画像を作ってみる」
    がとても参考になりそうなので動かそうとしてみました。
    しかし、「setSnapView(b); 」の部分でエラーが出てしまいます。

    もしよろしければ、
    この部分がどんな働きをしているのか、またどうすればエラーが出なくなるのか教えていただけませんでしょうか。

Leave a Reply

Additional comments powered by BackType