1

Bitmap.create(25, 25, Config.ARGB_8888) を使用してビットマップを作成します。

アルファ値が 0xA9 以下のピクセルを設定すると、渡されたものがピクセルに設定されません。別のスタック オーバーフローの質問を読み、setHasAlpha(true) を指定しました。これはテストで行いましたが、それでも問題はありませんでした。問題を解決しません。

私の問題を示す私のAndroidテストケースは次のとおりです。

    public void testSettingBitmaps() {
    Bitmap bitmap = Bitmap.createBitmap(25, 25, Config.ARGB_8888);
    bitmap.setHasAlpha(true);

    int color = 0x00fefefe;
    int x= 0;
    int y = 0;

    for(int alpha = 0xFF000000; alpha != 0x00000000; alpha = alpha - 0x01000000) {
        int colorPlusAlpha = color + alpha;
        bitmap.setPixel(x, y, colorPlusAlpha);  

        //
        // This test succeeds if the bitmap let us set the pixel.
        //
        assertEquals(String.format("Current alpha value: %x, Expected pixel value: %x, Actual pixel value: %x", alpha, colorPlusAlpha, bitmap.getPixel(x, y)), 
                colorPlusAlpha, bitmap.getPixel(x, y)); 

    }
}

このコードは次の出力で失敗します:junit.framework.AssertionFailedError: 現在のアルファ値: a9000000、予想されるピクセル値: a9fefefe、実際のピクセル値: a9fdfdfd

4

1 に答える 1

6

これは実際には意図したとおりに機能します。

問題は、ビットマップが事前に乗算されたアルファ形式で保存されることです。これは、ピクセル値を 0xa9fefefe に設定すると、格納される値は実際には 0xa9a8a8a8 (0xa9*0xfe/255=0xa8) になることを意味します。次に、getPixel() を呼び出すと、格納された値は「乗算前」になります。丸め誤差があると、0xa9fdfdfd になります。

内訳は次のとおりです。0xa9fefefe の ARGB 値を渡します。各 RGB バイトは、格納される前にアルファ値で乗算されます。簡単にするために、赤いバイトのみを見ていきます。

R=169*254/255 R=168 (または 0xa8)

次に、getPixel() を呼び出すと、RGB バイトがアルファで除算されます。

R=255*168/169 R=253 (または 0xfd)

于 2012-12-10T02:20:06.787 に答える