下载同一张图片,在windows中可以看到图片文件的大小是102K的,而inputStream通过BitmapFactory.decodeStream()方法转成bitmap却要分配750k的内存。而我直接用FileOutputStream把inputStream写入文件,文件大小是102k和windows里的一样,请问这种情况怎么造成的?
业精于勤,荒于嬉;行成于思,毁于随。
首先我们要明确两个概念:1,bitmap:这里,我理解的是Android系统中的bitmap图像格式,通常只在内存中存在,系统用于显示图像;2,文件:存在于硬盘或flash上的文件,通常是使用了某种压缩方式的,例如jpeg或png。这里,我以jpeg与bitmap为例进行对比说明:jpeg进行了压缩,适合存储,不能直接显示,需要解码之后才能显示;bitmap是没有压缩的图像,适合显示,不适合存储,因为占用了过多的存储空间。
咱们再来解释你看见的现象:在windows中看到图片文件的大小是102K的:这是压缩之后的文件;通过BitmapFactory.decodeStream()方法转成bitmap却要分配750k的内存:此时将压缩文件解压成内存中的bitmap文件了,这是适合进行显示的格式,解压之后,图像所占空间变大,具体有多大,前面 okadanana 的回答中已经说得很清楚了;直接用FileOutputStream把inputStream写入文件,文件大小是102k:这是将文件读到内存中,没有做解码操作,又原样写文件了,当然大小也没有变化。
图片是由像素组成的,所以要计算一张图片的大小,需要知道 3 个参数:
图片的长
图片的宽
每个像素占用的内存大小因此,得到一个公式
图片占用的内存大小 = 图片长 x 图片宽 x 每个像素占用的内存大小
在 Android 中,每个像素占用的内存大小是由 Bitmap.Config 来决定的,它有 4 种配置
所以,影响 BitmapFactory.decodeStream() 生成的 Bitmap 的大小的是 Bitmap.Config。所以读取出来的大小自然不一样了啊。
BitmapFactory.decodeStream()
Bitmap.Config
你下载的应该是jpg或者png的图片,这两种格式都有一定的压缩率,而你decode之后,在内存中会以rgb的形式存在,没有了压缩,自然就大了
首先我们要明确两个概念:
1,bitmap:这里,我理解的是Android系统中的bitmap图像格式,通常只在内存中存在,系统用于显示图像;
2,文件:存在于硬盘或flash上的文件,通常是使用了某种压缩方式的,例如jpeg或png。
这里,我以jpeg与bitmap为例进行对比说明:
jpeg进行了压缩,适合存储,不能直接显示,需要解码之后才能显示;
bitmap是没有压缩的图像,适合显示,不适合存储,因为占用了过多的存储空间。
咱们再来解释你看见的现象:
在windows中看到图片文件的大小是102K的:这是压缩之后的文件;
通过BitmapFactory.decodeStream()方法转成bitmap却要分配750k的内存:此时将压缩文件解压成内存中的bitmap文件了,这是适合进行显示的格式,解压之后,图像所占空间变大,具体有多大,前面 okadanana 的回答中已经说得很清楚了;
直接用FileOutputStream把inputStream写入文件,文件大小是102k:这是将文件读到内存中,没有做解码操作,又原样写文件了,当然大小也没有变化。
图片是由像素组成的,所以要计算一张图片的大小,需要知道 3 个参数:
图片的长
图片的宽
每个像素占用的内存大小
因此,得到一个公式
在 Android 中,每个像素占用的内存大小是由 Bitmap.Config 来决定的,它有 4 种配置
所以,影响
BitmapFactory.decodeStream()
生成的 Bitmap 的大小的是Bitmap.Config
。所以读取出来的大小自然不一样了啊。你下载的应该是jpg或者png的图片,这两种格式都有一定的压缩率,而你decode之后,在内存中会以rgb的形式存在,没有了压缩,自然就大了