Bitmap.setPixel()をsetPixels()に変えたら3倍速くなったよ

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

ずいぶん前に画像をモザイク風に加工するエントリを書きましたが、あれを少しいじったらだいぶ早くなりましたよ、というご報告です。

こんなコードでモザイク処理に350~360msくらいかかってました

Android開発でのパフォーマンスTips(1) | Techfirm Android Lab
を見直して、ループ前にgetterなどで参照する値はローカル変数にキャッシュしてみると、

310~320msになりました。
少しでも早くなると、テンションが上がる。

でもこのコードはまだまだ早くなれるはずだ。

今はループの中でbitmap.getPixelしてsetPixelして1ピクセル単位で読み書きしてるのでこれをガバッと一発で配列に取り出して、ループ内では配列を操作して、ループ後にsetPixelsで配列をセットするように変更してみる。

これだと、90~110msまで早くなった。

bitmap.getPixes()に引数は順番に
1.色の配列。int[]ここにピクセルデータが入ってくる
2.offset。int配列のどこから書きこむか。
3.謎
4.ビットマップのピクセルを読み始めるX座標
5.ビットマップのピクセルを読み始めるY座標
6.ビットマップの幅
7.ビットマップの高さ

ということなので、getPixelsの前にnew int[width * height]している。
Androidでは1ピクセルのカラー情報はintで表わすので、それを横×縦分の配列で受け取っている。

setPixelsはgetPixelsの逆。
第一引数のint配列をbitmap上のどこに書くかを指定する。

copyPixelsToBufferや copyPixelsFromBuffer の方が早いかもしれないがまだ試していない。
きっとBig iguchiがやってくれるに違いない。

関連する投稿