2017-09-03 19 views
0

我试图在位图中隐藏一个小文件。我将ARGB的最低有效位设置为文件中的每个位(位图的前几个像素为文件大小保留)。为什么保存的png之间会有轻微的位图不匹配,并且,打开png

为了这个调试目的,我将编码的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位/采样,truecolor + alpha,非隔行 sBIT:RGBA8 IDAT IEND

PNG照片看起来很好,没有问题。

编辑:进度!

我追踪了这个基本问题。
Bitmap.setPixels与Bitmap.getpixels的功能不同。

以下代码显示转换和转换2之间的细微差异。大约每百位1或2位。这对我来说似乎很震惊。这是一个android bug吗?

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

你认为什么是argb值的LSB? – greenapps

+0

'试图隐藏位图中的小文件'。它看起来更像是隐藏在一个PNG文件中。 – greenapps

+0

greenapps:lsb是A:XXXXXXX_ R:XXXXXXX_ G:XXXXXXX_ B:XXXXXXX_其中X是像素的位,_是文件的位。因此,文件的每个字节都存储在8个字节的像素中,或者像素文件的2个整数表示为32位的argb颜色。而且,是的,我将它存储在位图中并压缩为png,因为png应该是无损的。 –

回答

0

这与this thread中的问题相同。

我有一个简单的解决方案,只是递增和取消关闭A,R,G或B值,直到LSB,如果每个是正确的。显然这会导致一个更扭曲的位图,但它似乎是我能想到的唯一解决方案。