Android NDKを使用してJava言語とC言語で速度比較をする(画像処理編)
こんにちはBig iguchiです。
前回の「Android NDKを使用してJava言語とC言語で速度比較をする」に引き続きAndroid NDKで遊んでみます。
今回はただ、計算するだけでなく少し実用的に画像の平均RGBを取得するコードをJavaとC言語で比較しようと思います。
まずは、ちょっと画像の説明。。。。
Androidの場合、画像データをBitmapで扱うことが多いのですが、このままだとC言語で扱いにくいので、「Bitmap.setPixel()をsetPixels()に変えたら3倍速くなったよ」でdaichi1128が言っているようにgetPixelsでint型の配列として色情報を取得します。以下になります。
bitmap.getPixels(pixels, 0, originalWidth, 0, 0, originalWidth, originalHeight);
getPixelsの第1引数にはbitmapの色情報がint型で以下のフォーマットで返ってきます。
0xFFFFFFFF
| 24~31ビット | alpha |
| 16~23ビット | red |
| 8~15ビット | green |
| 0~7ビット | blue |
つまり、以下のコードでピクセル毎にRGBカラーを取得できるということですね。
つぎに、配列をJavaからC言語に渡すときの説明。。。。
この処理をC言語で行いたいために、この第1引数のint配列をJavaからC言語に渡せればいいですね。方法は以下のようにしました。
・Java言語側
・C言語側
同様な処理をJavaでも記述して、前回と同様に実行してみました。
結果は以下になります。。。。

JavaとNativeで答えも一致してますね。海の画像を使ってみたんですがblueとgreenの平均値が高いのできちんと解析できてますね。そして速度もNativeの方がかなり早い。画像処理にもAndroid NDKは十分使えそうです。
これを応用すれば、「Androidでモザイク画像を作ってみる」のモザイク処理や他の画像処理も高速化出来ると思います。皆さんぜひやってみてください。
今回は以上となります。
海に行きたい。

C言語側の15行目ってもしかして
sumGreen += (arr1[i] & 0x0000FF00) >> 16;
では無く
sumRed += (arr1[i] & 0x00FF0000) >> 16;
ですか?
15行目のC言語。私も山田さんと同じ意見です…
赤ピクセルの合計数を求めているコードが見つかりません。