Maison > Questions et réponses > le corps du texte
下载同一张图片,在windows中可以看到图片文件的大小是102K的,而inputStream通过BitmapFactory.decodeStream()方法转成bitmap却要分配750k的内存。而我直接用FileOutputStream把inputStream写入文件,文件大小是102k和windows里的一样,请问这种情况怎么造成的?
巴扎黑2017-04-17 17:49:36
首先我们要明确两个概念:
1,bitmap:这里,我理解的是Android系统中的bitmap图像格式,通常只在内存中存在,系统用于显示图像;
2,文件:存在于硬盘或flash上的文件,通常是使用了某种压缩方式的,例如jpeg或png。
这里,我以jpeg与bitmap为例进行对比说明:
jpeg进行了压缩,适合存储,不能直接显示,需要解码之后才能显示;
bitmap是没有压缩的图像,适合显示,不适合存储,因为占用了过多的存储空间。
咱们再来解释你看见的现象:
在windows中看到图片文件的大小是102K的:这是压缩之后的文件;
通过BitmapFactory.decodeStream()方法转成bitmap却要分配750k的内存:此时将压缩文件解压成内存中的bitmap文件了,这是适合进行显示的格式,解压之后,图像所占空间变大,具体有多大,前面 okadanana 的回答中已经说得很清楚了;
直接用FileOutputStream把inputStream写入文件,文件大小是102k:这是将文件读到内存中,没有做解码操作,又原样写文件了,当然大小也没有变化。
PHP中文网2017-04-17 17:49:36
图片是由像素组成的,所以要计算一张图片的大小,需要知道 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
。所以读取出来的大小自然不一样了啊。
伊谢尔伦2017-04-17 17:49:36
你下载的应该是jpg或者png的图片,这两种格式都有一定的压缩率,而你decode之后,在内存中会以rgb的形式存在,没有了压缩,自然就大了