Chr*_*hms 1 android steganography bitmap
使用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));
}
}
Run Code Online (Sandbox Code Playgroud)
此代码失败,输出如下:junit.framework.AssertionFailedError:当前alpha值:a9000000,预期像素值:a9fefefe,实际像素值:a9fdfdfd预期:< - 1442906370>但是:< - 1442972163>
这实际上按预期工作.
问题是位图以预乘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)