画像から一部を抜き出して使ってみたい
http://blog.livedoor.jp/shizuku_kun/archives/51384897.html

にて書いた、Bitmap.getPixels()の謎だった引数についての使い方がわかりました。公式ドキュメントの

stride The number of entries in pixels[] to skip between rows (must be >= bitmap's width). Can be negative.

これじゃよくわかんなかったです!ので解説。

行ごとに、配列のoffset + stride * n番目から格納します

これじゃよくわかんないですね。

以下例をあげてみます。

サンプル用の元データは5*5でこんな感じ

bmp55

枠がありますけど、ドット単位でわかりやすく区切ってるだけです。

次にcolorsを渡すint配列を用意

new_array

ほんとはintが入る配列ですが、視覚的にわかりやすくするように、intを画素に変換した状態で表示します。

strideに5を渡した結果、配列の5n+offset番ごとに行が入ってる

array_stride_5

これは

Bitmap.getPixels( array // 受け取る配列
                , 0    // arrayの何番目を最初にするか
                , 5    // 今回の謎引数
                , 0    // x = 0
                , 0    // y = 0 を基点に
                , 5    // 横5
                , 5 ); // 縦5の範囲を受け取る

こんな感じにgetPixels()を使った結果です。

下に5, 10, 15, 20と書いたような感じに、行が5n番目ごとに配置されて、単に横並びになった感じになります。

今回offsetは0なので5nだけですね。

10を渡すと、行が10n+offsetごとに入ります。

array_stride_10

次のコードはこんな感じ

Bitmap.getPixels( array // 受け取る配列
                , 0    // arrayの何番目を最初にするか
                , 10   // 今回の謎引数
                , 0    // x = 0
                , 0    // y = 0 を基点に
                , 5    // 横5
                , 5 ); // 縦5の範囲を受け取る

10nごとに入ります。(offsetは0なので10nだけ。

どんなときに使える?

最終的に用意したい画像の横の長さ10として、配列内で画像を合成してしまいたいという場合には、strideにその長さの10を入れるなどして使えます。

BitmapA,BitmapBそれぞれ5*5を取得して合成

BitmapA.getPixels( array // 受け取る配列
                , 0    // まず0番目から入れます
                , 10   // 合成後の幅は10で
                , 0    // x = 0
                , 0    // y = 0 を基点に
                , 5    // 横5
                , 5 ); // 縦5の範囲を受け取る
/*
 * この時点で、配列の0-4, 10-14, 20-24, 30-34, 40-44に画素が入ってます
 * 画像の右部分にあたる部分は何も書き込まれていません。
 */
BitmapB.getPixels( array // 受け取る配列
                , 5    // 5番目から
                , 10   // 合成後の幅は10
                , 0    // x = 0
                , 0    // y = 0 を基点に
                , 5    // 横5
                , 5 ); // 縦5の範囲を受け取る
/*
 * これで残りの 5-9, 15-19, 25-29, 35-39, 45-49 に入ります。
 */

横に並んだような状態で配列に格納されます。

ほかにも……

負の値を入れると、画像の上行から順に配列の後ろ側から入ることになるので(当然オフセットで配列の後ろのほうから書き込むようにしましょう)、上下が逆に格納されて、そのまま描画で上下反転とかできそうです。


Android NDKネイティブプログラミング
Android NDKネイティブプログラミング