压缩后,Bitmap ByteCount保持不变

时间:2015-09-04 14:32:50

标签: java android android-bitmap image-compression

我试图通过以下方式查看各种压缩质量的结果:

private static Bitmap codec(Bitmap src, Bitmap.CompressFormat format,
                                int quality) {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        src.compress(format, quality, os);

        byte[] array = os.toByteArray();
        return BitmapFactory.decodeByteArray(array, 0, array.length);
    }

我有一个名为bitmap的位图,我将其与压缩版本进行比较:

Bitmap compressed = codec(bitmap,Bitmap.CompressFormat.JPEG ,10);
Log.d("result","bitmap=" + bitmap.getByteCount() + " compressed=" + compressed.getByteCount());

无论我选择加载到bitmap中的哪张照片,压缩版本的字节数仍然与位图的字节数相同 - 但是,如果我将compressed加载到一个ImageView,质量明显降低。

在降低图像的视觉质量的同时,尺寸是否真的保持不变?我是否错误地获取了文件的大小?

编辑: 更奇怪的是,对于在图库详细信息中显示16343040的图片,结果大小显示1.04mb个字节。

我使用以下内容获取原始bitmaponActivityResult

InputStream is = getContentResolver().openInputStream(selectedImageUri);
bitmap = BitmapFactory.decodeStream(is);
is.close();

selectedImageUri来自getData()或从设备存储中选择的文件。

3 个答案:

答案 0 :(得分:1)

通过Bitmap getByteCount()getAllocationByteCount()返回可用于表示图像中像素的最小字节数,即最大压缩大小,即使是未压缩的图片!您应该使用Bitmap,因为它返回<bean id="b" scope="prototype" class="example.component.B"/> <bean id="c" class="example.component.C"/> 实际使用的字节数。

答案 1 :(得分:1)

Bitmap是一种显示图像的内存数据结构。您的byte[] array会将大小告知磁盘:array.length

(完全清楚。)内存中的位图可能不会使用更多或更少的内存。 (正好在使用其他颜色模型时,如256种索引颜色。)

答案 2 :(得分:1)

BitmapFactory.decodeByteArray 将压缩图像转换为未压缩图像(RGBA8格式)。所以,基本上,你的 codec()函数接收RGBA8图像,压缩它,然后在返回结果之前将其解压缩回RGBA8。

Smaller PNG Files中讨论过这个问题; Android不直接使用压缩图像 ;所有图像数据都必须从压缩格式转换为RGBA8格式,以便渲染系统可以正确使用它们(参见Rendering Performance 101)。

如果你想要一个较小的内存中图像表示,你需要使用不同的像素格式,如RGB656(在Smaller Pixel Formats中讨论)