4

JNI 経由で C++ 関数を呼び出し、RGBA_8888 ビットマップを渡し、ロックし、値を変更し、ロックを解除してから、次の C++ コードを使用して Java で表示します。

AndroidBitmap_getInfo(env, map, &info) < 0);
AndroidBitmap_lockPixels(env, map, (void**)&pixel);

for(i=info.width*info.height-1;i>=0;i--)
{   pixel[i] = 0xf1f1f1f1;
}

AndroidBitmap_unlockPixels(env, map);

私が抱えている問題は、ビットマップが期待どおりに見えず、ピクセル値 (getPixel で検証) が、C++ で設定したものと Java でチェックしたときに同じではないことです。ビットマップ値を 0xffffffff に設定すると、Java では正しい値が得られますが、他の多くの場合はそうではありません。たとえば、0xf1f1f1f1 は 0xF1FFFFFF に変わります。

それを機能させるにはどうすればよいですか?

PS: Android 2.3.4 を使用しています

4

1 に答える 1

3

問題は、乗算済みのアルファが原因のようです。

さらにテストを行った結果、r、g、b の値がアルファによってスケーリングされることが明らかになったので、jni にビットマップを渡す場合、r、g、b の値を 255 倍してアルファで除算し、実際の値を取得する必要があります。でアルファ操作を行うことができます。それらを戻すときは、逆にする必要があります。

アルファが最大の不透明度の場合は 255 になり、* 255 / 255 はそれ自体を無効にするため、アルファを使用しないコピーと操作のみが必要です。

于 2012-06-10T00:04:38.870 に答える