我试图在位图中隐藏一个小文件。我将ARGB的最低位设置为文件中的每个位(我为文件大小保留的位图的前几个像素)。
为了这个调试目的,我将编码的int []与解码的int []进行比较。每隔几百个字节就有一个不正确的位。
我通过Bitmap.compress方法保存图片,如此......
OutputStream out = getContentResolver().openOutputStream(fileUri);
picture.compress(Bitmap.CompressFormat.PNG,100,out);
然后,从图像中提取文件...
pic = MediaStore.Images.Media.getBitmap(this.getContentResolver(), fileUri);
pic.getPixels(intArr, 0, width, 0, 0, width, height);
我冒昧地检查了其中一个png,我确实使用argb8作为配置,使用tweakPNG,发现生成的文件中唯一的块是 IHDR:8位/样本,真彩色+ alpha,非隔行扫描 sBIT:RGBA8 IDAT IEND
PNG照片看起来不错,没有问题。
编辑:进度!
我将这个问题跟踪到了这个基本问题 Bitmap.setPixels与Bitmap.getpixels的功能不同。
以下代码显示convert2和converted2之间的细微差别。大约每百位1或2位。这对我来说似乎很震惊。这是一个机器人的错误吗?
picture3 = Bitmap.createBitmap(picture1.getWidth(), picture1.getHeight(), Bitmap.Config.ARGB_8888);
picture3.setPixels(converted,0,picture1.getWidth(),0,0,picture1.getWidth(), picture1.getHeight());
int[] converted2 = new int[converted.length];
picture3.getPixels(converted2,0,picture1.getWidth(),0,0,picture1.getWidth(), picture1.getHeight());
答案 0 :(得分:0)
这与this thread中的问题相同。
我有一个简单的解决方案,只需增加和描述关闭A,R,G或B值,直到lsb(如果每个都正确)。显然这会导致更加扭曲的位图,但它似乎是我能想到的唯一解决方案。