android - BitmapFactory.decodeStream()方法分配内存变大的问题
迷茫
迷茫 2017-04-17 17:47:36
0
3
671

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

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
巴扎黑

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

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

Ty80

图片是由像素组成的,所以要计算一张图片的大小,需要知道 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。所以读取出来的大小自然不一样了啊。

伊谢尔伦

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板