Android位图。setPixel(x,y,颜色)是传入值的设置
使用bitmap.Create(25,25,Config.ARGB_8888)创建位图 设置alpha值小于或等于0xA9的像素会导致该像素未设置传入的内容。我读到另一个堆栈溢出问题对setHasAlpha(true)说,这是我在测试中做的,但这仍然没有解决问题 下面是我的android测试用例,显示了我的问题: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
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的值始终完全匹配。如果您正在编写测试,您需要考虑测试条件中的舍入错误。感谢您的解释!出于某种疯狂的原因,我认为非预乘应该总是返回初始值,但事实上,这并不是因为舍入误差。