图片(Bitmap)二次采样、图片内存计算

一、二次采样

在加载大量图片的时候经常会遇到OOM,为了避免OOM我们要对得到的bitmap做相应的处理。

原理:不存储图片本身只存储图片的宽高
BitmapFactory.Options提供了另一个成员inJustDecodeBounds。设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,即opts.outwidth和opts.outheight。有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。

private Bitmap createImageThumbnail(String filePath, int newHeight,int newWidth) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
int oldHeight = options.outHeight;
int oldWidth = options.outWidth;
// Log.i(TAG, "高度是:" + oldHeight + ",宽度是:" + oldWidth);
int ratioHeight = oldHeight / newHeight;
int ratioWidth = oldWidth / newWidth;

options.inSampleSize = ratioHeight > ratioWidth ? ratioHeight: ratioWidth ;

options.inJustDecodeBounds = false;
Bitmap bm = BitmapFactory.decodeFile(filePath, options);
// Log.i(TAG, "高度是:" + options.outHeight + ",宽度是:" + options.outWidth);
return bm;
}

二、Bitmap占用内存的计算:

(一)、概述:
Android中一张图片(Bitmap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数。一张图片(Bitmap)占用的内存=图片长度图片宽度单位像素占用的字节数注:图片长度和图片宽度的单位是像素。图片(Bitmap)占用的内存应该和屏幕密度(Density)无关。
创建一个Bitmap时,其单位像素占用的字节数由其参数BitmapFactory.Options的inPreferredConfig变量决定。

(二)、inPreferredConfig为Bitmap.Config类型,Bitmap.Config类是个枚举类型,它可以为以下值 Enum Values:

1、Bitmap.Config ALPHA_8 :
此时图片只有alpha值,没有RGB值,一个像素占用一个字节 。

2、Bitmap.Config ARGB_8888:
一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bites , 共32bites , 即4个字节。这是一种高质量的图片格式,电脑上普通采用的格式。它也是Android手机上一个BitMap的默认格式。

3、Bitmap.Config RGB_565:
一个像素占用2个字节,没有alpha(A)值,即不支持透明和半透明, Red(R)值占5个bites ,Green(G)值占6个bites ,Blue(B)值占5个bites,共16bites,即2个字节。 对于半透明颜色的图片来说,该格式的图片能够达到比较好的呈现效果,相对于ARGB_8888来说也能减少一半的内存开销,因此它是一个不错的选择。
另外我们通过android.content.res.Resources来取得一个张图片时,它也是以该格式来构建BitMap。从Android4.0开始,该选项无效。即使设置为该值,系统任然会采用 ARGB_8888来构造图片。

【备注】:ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其实所有的可见色都是红绿蓝组成的,所以红绿蓝又称为三原色。 ARGB就是:透明度 红色 绿色 蓝色。

(三)、图片格式占用内存的计算方法:以一张100*100px的图片占用内存为例
ALPHA_8:
图片长度*图片宽度
100*100=10000字节
ARGB_8888:
图片长度*图片宽度*4
100*100*4=40000字节
RGB_565:
图片长度*图片宽度*2
100*100*2=20000字节

猜你喜欢

转载自blog.csdn.net/hello_1s/article/details/77934215