2

Android ndk を使用して簡単な画像フィルタリングを実行しようとしていますが、ビットマップの RGB 値の取得と設定に問題があるようです。

実際の処理をすべて取り除き、ビットマップのすべてのピクセルを赤に設定しようとしていますが、代わりに青の画像になってしまいます。私が見落としている単純なものがあると思いますが、どんな助けでも大歓迎です。

static void changeIt(AndroidBitmapInfo* info, void* pixels){
int x, y, red, green, blue;

for (y=0;y<info->height;y++) {


     uint32_t * line = (uint32_t *)pixels;
        for (x=0;x<info->width;x++) {

            //get the values
            red = (int) ((line[x] & 0xFF0000) >> 16);
            green = (int)((line[x] & 0x00FF00) >> 8);
            blue = (int) (line[x] & 0x0000FF);

            //just set it to all be red for testing
            red = 255;
            green = 0;
            blue = 0;

            //why is the image totally blue??
            line[x] =
              ((red << 16) & 0xFF0000) |
              ((green << 8) & 0x00FF00) |
              (blue & 0x0000FF);
        }

        pixels = (char *)pixels + info->stride;
    }
}

各ピクセルのRGB値を取得してから設定するにはどうすればよいですか??

回答を更新し
て以下に指摘したように、リトルエンディアンが使用されているようです。そのため、元のコードでは、赤と青の変数を切り替えるだけで済みました。

static void changeIt(AndroidBitmapInfo* info, void* pixels){
int x, y, red, green, blue;

for (y=0;y<info->height;y++) {


     uint32_t * line = (uint32_t *)pixels;
        for (x=0;x<info->width;x++) {

            //get the values
            blue = (int) ((line[x] & 0xFF0000) >> 16);
            green = (int)((line[x] & 0x00FF00) >> 8);
            red = (int) (line[x] & 0x0000FF);

            //just set it to all be red for testing
            red = 255;
            green = 0;
            blue = 0;

            //why is the image totally blue??
            line[x] =
              ((blue<< 16) & 0xFF0000) |
              ((green << 8) & 0x00FF00) |
              (red & 0x0000FF);
        }

        pixels = (char *)pixels + info->stride;
    }
}
4

1 に答える 1

2

ピクセル形式によって異なります。おそらく、ビットマップは RGBA です。したがって、0x00FF0000 はバイト シーケンス 0x00、0x00、0xFF、0x00 (リトル エンディアン) に対応し、透明度 0 の青色です。

私は Android 開発者ではないので、AndroidBitmapInfo.format フィールドに基づいて、カラー コンポーネントを取得/設定するためのヘルパー関数があるかどうか、または自分で行う必要があるかどうかはわかりません。API ドキュメントを読む必要があります。

于 2012-08-05T01:42:22.707 に答える