recherche

Maison  >  Questions et réponses  >  le corps du texte

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

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

迷茫迷茫2773 Il y a quelques jours672

répondre à tous(3)je répondrai

  • 巴扎黑

    巴扎黑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:这是将文件读到内存中,没有做解码操作,又原样写文件了,当然大小也没有变化。

    répondre
    0
  • PHP中文网

    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。所以读取出来的大小自然不一样了啊。

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:49:36

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

    répondre
    0
  • Annulerrépondre