0%

Bitmap Next

前言

Android Bitmap 的一些总结

Bitmap 占用内存大小

Bitmap 实际站用的内容大小可以通过 Bitmap 提供的方法
getAllocationByteCount() 获取到。

也可以提前进行估算,估算公式为

图片实际高 x scale x 图片实际宽度 x scale x 图片每个像素占用的 byte

scale 计算方式为 当前设备 densityDpi/图片所在目录dpi

图片所在目录对应的 dpi 如下表

目录 mdpi hdpi xhdpi xxhdpi xxxhpi
density 1 1.5 2 3 4
densityDpi 160 240 320 480 640

比如下面这幅图,实际宽高为 1200x800 .

在屏幕密度为 420 的 Pixel2 上,当图片被放在 drawable-xxxhpi 文件夹下时,占用内存为

图片内存 = 1200 x (420/640) x 800 x(420/640) x 4 = 1654800 byte
图片宽度 = 1200 x 420/640
图片高度 = 800 x 420/640

可以看到,当图片放在不同的目录时,图片自身的大小以及所占用的内存都将会有不同的值。

从中也可以看到规律,当图片对应文件夹 dpi 大于 手机 dpi 时,在实际展示的时候将对图片进行缩小的处理,因为 scale 的值小于 1 。当然,如果手机屏幕密度和当前图片所在的文件夹的密度相同的话,那么将不会进行缩放。 反之,一旦 scale 参数大于 1 时,不但图片自身会被放大,占用的内存也会发生较大的增长,毕竟 scale 在计算公式中要做两次乘数。

因此,把图片放到适合主流手机 dpi 的目录下是较好的选择。

BitmapFactory.Options

BitmapFactory.Options 的常用成员变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//获取图片信息
public boolean inJustDecodeBounds;
//设置图片采样率
public int inSampleSize;
//像素在内存中的存储格式,默认为 Bitmap.Config.ARGB_8888
public Bitmap.Config inPreferredConfig = Bitmap.Config.ARGB_8888;
//文件所在文件夹的屏幕分辨率
public int inDensity;
//真实设备屏幕分辨率
public int inTargetDensity;
//设置是否需要缩放
public boolean inScaled;
//图片原始宽度
public int outWidth;
//图片原始高度
public int outHeight;
//图片 MIME 类型,例如 JPEG GIF 等
public String outMineType;

Bitmap 存在了哪里

参考文档

Android Bitmap图片优化分析
Android Bitmap优化: 关于 Bitmap 你要知道的一切

加个鸡腿呗.