【问题标题】:Bitmap ByteCount remaining the same after compression压缩后位图字节计数保持不变
【发布时间】:2015-11-30 18:20:26
【问题描述】:

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

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,质量会明显降低。

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

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

我通过onActivityResult 获取原始bitmap 使用:

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

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

【问题讨论】:

  • 位图没有压缩版本。解码数组或流后,您就可以解压缩/解压缩数据。由于位图与原始位图具有相同的分辨率,因此它需要相同数量的内存字节。 '结果大小显示 16343040 字节的图像,在画廊详细信息中显示 1.04mb。'。您可以像 16.343.040 一样友好地写下它,这并不奇怪。 jpg 比位图需要更少的字节数。

标签: java android android-bitmap image-compression


【解决方案1】:

Android Developer reference 代表BitmapgetByteCount() 返回可用于表示图像中像素的最小字节数,即最大压缩大小,即使对于未压缩的图像也是如此!您应该改用getAllocationByteCount(),因为它返回Bitmap 实际使用的字节数。

【讨论】:

  • 似乎即使在切换到getAllocationByeCount() 后我也得到了相同的结果。
  • 在您的codec 方法中,您可以尝试查看src.compress() 是否返回true?
  • 另外,尝试使用BitmapFactory.decodeStream()方法直接解码os,而不是将其转换为byte[]中间
  • 抱歉,我的意思是说我已经确定 compress() 正在返回 true ——但图像正在被压缩也非常明显!
【解决方案2】:

位图是一种显示图像的内存数据结构。你的byte[] array 会告诉你磁盘上的大小:array.length

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

【讨论】:

    【解决方案3】:

    BitmapFactory.decodeByteArray 将压缩图像转换为未压缩图像(RGBA8 格式)。因此,基本上,您的 codec() 函数接收 RGBA8 图像,对其进行压缩,然后在返回结果之前将其解压缩回 RGBA8。

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

    如果您想要图像在内存中的表示形式更小,则需要使用不同的像素格式,例如 RGB656(在Smaller Pixel Formats 中进行了讨论)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      相关资源
      最近更新 更多