Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android位图。setPixel(x,y,颜色)是传入值的设置_Android_Bitmap_Steganography - Fatal编程技术网

Android位图。setPixel(x,y,颜色)是传入值的设置

Android位图。setPixel(x,y,颜色)是传入值的设置,android,bitmap,steganography,Android,Bitmap,Steganography,使用bitmap.Create(25,25,Config.ARGB_8888)创建位图 设置alpha值小于或等于0xA9的像素会导致该像素未设置传入的内容。我读到另一个堆栈溢出问题对setHasAlpha(true)说,这是我在测试中做的,但这仍然没有解决问题 下面是我的android测试用例,显示了我的问题: public void testSettingBitmaps() { Bitmap bitmap = Bitmap.createBitmap(25, 25, Confi

使用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:当前alpha值:a9000000,预期像素值:a9fefefe,实际像素值:a9fdfdfd预期值:但为:

这实际上按预期工作

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

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

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

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

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

这实际上按预期工作

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

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

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

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

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

所以我必须确保始终使用0xFF的alpha?不,您可以使用任何想要的alpha,只是不要期望setPixel/getPixel的值总是完全匹配。如果您正在编写测试,您需要考虑测试条件中的舍入错误。感谢您的解释!出于某种疯狂的原因,我认为非预乘应该始终返回初始值,但事实上,这并不是因为舍入错误。因此,我必须确保始终使用0xFF的alpha?不,您可以使用任何想要的alpha,只是不要期望setPixel/getPixel的值始终完全匹配。如果您正在编写测试,您需要考虑测试条件中的舍入错误。感谢您的解释!出于某种疯狂的原因,我认为非预乘应该总是返回初始值,但事实上,这并不是因为舍入误差。