Android bitmap.setPixel(x,y,color)是传递值的设置

时间:2012-12-10 02:03:49

标签: android bitmap steganography

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

设置一个alpha值小于或等于0xA9的像素会导致像素没有被传入的内容设置。我读了另一个堆栈溢出问题说setHasAlpha(true),我在测试中做了 - 但是仍然没有解决问题。

这是我的安卓测试案例,显示了我的问题:

    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:当前alpha值:a9000000,预期像素值:a9fefefe,实际像素值:a9fdfdfd expected:< -1442906370>但是:< -1442972163>

1 个答案:

答案 0 :(得分:6)

这实际上是按预期工作的。

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

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

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

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

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