1

使用 Bitmap.create(25, 25, Config.ARGB_8888) 创建位图

设置一个 alpha 值小于或等于 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: Current alpha value: a9000000, Expected pixel value: a9fefefe, Actual pixel value: a9fdfdfd expected:<-1442906370> but was:<-1442972163>

4

1 回答 1

6

这实际上按预期工作。

问题是位图以预乘 alpha 格式存储。这意味着当您将像素值设置为 0xa9fefefe 时,存储的值实际上是 0xa9a8a8a8 (0xa9*0xfe/255=0xa8)。然后当您调用 getPixel() 时,存储的值是“未预乘的”。如果出现舍入错误,您会得到 0xa9fdfdfd。

这是一个细分,您传递了一个 ARGB 值 0xa9fefefe。每个 RGB 字节在存储之前将乘以 alpha 值。为简化起见,我们只看红色字节:

R=169*254/255 R=168(或0xa8)

然后当您调用 getPixel() 时,RGB 字节除以 alpha:

R=255*168/169 R=253(或0xfd)

于 2012-12-10T02:20:06.787 回答