android - BitmapFactory.decodeStream()方法分配内存变大的问题

 werwd2_736 发布于 2022-10-31 09:06

下载同一张图片,在windows中可以看到图片文件的大小是102K的,而inputStream通过BitmapFactory.decodeStream()方法转成bitmap却要分配750k的内存。而我直接用FileOutputStream把inputStream写入文件,文件大小是102k和windows里的一样,请问这种情况怎么造成的?

3 个回答
  • 你下载的应该是jpg或者png的图片,这两种格式都有一定的压缩率,而你decode之后,在内存中会以rgb的形式存在,没有了压缩,自然就大了

    2022-10-31 22:33 回答
  • 图片是由像素组成的,所以要计算一张图片的大小,需要知道 3 个参数:

    • 图片的长

    • 图片的宽

    • 每个像素占用的内存大小
      因此,得到一个公式

    图片占用的内存大小 = 图片长 x 图片宽 x 每个像素占用的内存大小

    在 Android 中,每个像素占用的内存大小是由 Bitmap.Config 来决定的,它有 4 种配置

    配置 占用的字节数
    Bitmap.Config.ALPHA_8 一个像素1个字节
    Bitmap.Config.ARGB_4444 一个像素2个字节
    Bitmap.Config.RGB_565 一个像素2个字节
    Bitmap.Config.ARGB_8888 一个像素4个字节

    所以,影响 BitmapFactory.decodeStream() 生成的 Bitmap 的大小的是 Bitmap.Config。所以读取出来的大小自然不一样了啊。

    2022-10-31 22:33 回答
  • 首先我们要明确两个概念:
    1,bitmap:这里,我理解的是Android系统中的bitmap图像格式,通常只在内存中存在,系统用于显示图像;
    2,文件:存在于硬盘或flash上的文件,通常是使用了某种压缩方式的,例如jpeg或png。
    这里,我以jpeg与bitmap为例进行对比说明:
    jpeg进行了压缩,适合存储,不能直接显示,需要解码之后才能显示;
    bitmap是没有压缩的图像,适合显示,不适合存储,因为占用了过多的存储空间。

    咱们再来解释你看见的现象:
    在windows中看到图片文件的大小是102K的:这是压缩之后的文件;
    通过BitmapFactory.decodeStream()方法转成bitmap却要分配750k的内存:此时将压缩文件解压成内存中的bitmap文件了,这是适合进行显示的格式,解压之后,图像所占空间变大,具体有多大,前面 okadanana 的回答中已经说得很清楚了;
    直接用FileOutputStream把inputStream写入文件,文件大小是102k:这是将文件读到内存中,没有做解码操作,又原样写文件了,当然大小也没有变化。

    2022-10-31 22:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有