我试图在位图中隐藏一个小文件。我将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());
你认为什么是argb值的LSB? – greenapps
'试图隐藏位图中的小文件'。它看起来更像是隐藏在一个PNG文件中。 – greenapps
greenapps:lsb是A:XXXXXXX_ R:XXXXXXX_ G:XXXXXXX_ B:XXXXXXX_其中X是像素的位,_是文件的位。因此,文件的每个字节都存储在8个字节的像素中,或者像素文件的2个整数表示为32位的argb颜色。而且,是的,我将它存储在位图中并压缩为png,因为png应该是无损的。 –