Bitmap 二次采样

图片大小的影响因素

android中大的图片一般要经过压缩才显示,否则可能会发生OOM。图片所占用的内存和图片的宽度、长度、单位像素占的字节数三个因素有关。

Bitmap二次采样

android 图片占用内存与什么有关

图片色彩

我们都知道颜色经常用ARGB来表示,A表示Alpha,即透明度;R表示red,即红色;G表示green,即绿色;B表示blue,即蓝色。Bitmap的色彩也是用ARGB来表示的

一、二次采样:

原文链接:

Bitmap.Config

Bitmap.Config中有Bitmap.Config.ALPHA_8、Bitmap.Config.RGB_565、Bitmap.Config.ARGB_4444、Bitmap.Config.ARGB_8888有四个枚举变量。Bitmap.Config.ALPHA_8表示:每个像素占8位,没有色彩,只有透明度A-8,共8位。Bitmap.Config.ARGB_4444表示:每个像素占16位,A-4,R-4,G-4,B-4,共4+4+4+4=16位。Bitmap.Config.RGB_565表示:每个像素占16位,没有透明度,R-5,G-6,B-5,共5+6+5=16位。Bitmap.Config.ARGB_8888表示:每个像素占32位,A-8,R-8,G-8,B-8,共8+8+8+8=32位。位数越高,那么可存储的颜色信息越多,图像也就越逼真。

(一)、意义或目的:

在开发手机应用的时候,内存是有限的,那使用的时候,就要合理的运用和释放。
那么最占用内存的,估计也是就图片了,有时候,需要在加载一些大量的图片。但是,往往回报内存溢出的错误。看看图片的大小呢,也

Bitmap内存计算

ARGB_8888是最占内存的,因为一个像素占32位,8位=1字节,所以一个像素占4字节的内存。ARGB_4444的一个像素占2个字节。RGB_565的一个像素也是占两个字节。ALPHA_8的一个像素只占一个字节。一个图片的像素=图片宽度
×
图片长度。一张图片占用的内存=图片宽度×图片长度×单位像素占用的字节数(图片的像素×单位像素占用的字节数)假设有一张480×800的图片,四个格式下所占的内存如下

类型 内存计算 占内存大小(B 占内存大小
ARGB_8888 480×800×4 1536000 1536000÷1024=1500
ARGB_4444 480×800×2 768000 768000÷1024=750
ARGB_565 480×800×2 768000 768000÷1024=750
ARGB_8 480×800×1 384000 384000÷1024=375

1、用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。BitmapFactory.decodeFile(imageFile);

不大,也就20KB左右,为什么还是很占内存呢?

2、BitmapFactory.Options.inSampleSize:设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。

原来,将图片转成bitmap
来使用的时候,图片所占的内存,不是它原来的大小,是与
图片的宽度,高度,和颜色深度有关系。

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

图片实际占用的内存大小 =  width  *  height  *   颜色深度

例如:

颜色深度:

BitmapFactory.Options opts = new BitmapFactory.Options();

Bitmap.Config ALPHA_8  
Bitmap.Config ARGB_4444  
Bitmap.Config ARGB_8888  
Bitmap.Config RGB_565

opts.inSampleSize = 4;

A R G B
透明度 红色 绿色 蓝色

Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

其实这都是色彩的存储方法:我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其实所有的可

(二)、获取inSampleSize:

见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值

设置恰当的inSampleSize是解决该问题的关键之一。

Bitmap.Config  ARGB_4444              每个像素  占四位 
Bitmap.Config  ARGB_8888    32        每个像素  占八位
Bitmap.Config  RGB_565      16        R占5位    R占6位     B占5位   
没有透明度(A)

查看Android源码,我们得知,为了得到恰当的inSampleSize,Android提供了一种动态计算的方法。

说白了就ALPHA_8就是Alpha由8位组成
ARGB_4444就是由4个4位组成即16位,
ARGB_8888就是由4个8位组成即32位,
RGB_565就是R为5位,G为6位,B为5位共16位

1、核心代码:

由此可见:
ALPHA_8        代表8位Alpha位图
ARGB_4444      代表16位ARGB位图
ARGB_8888      代表32位ARGB位图

privateBitmap createImageThumbnail(String filePath,intnewHeight,

eg:
一张20KB的图片,宽1024(px)*高1024(px)*图片的颜色模式,就是它所占的真实的内存。

intnewWidth) {

BitmapFactory.Options options =newBitmapFactory.Options();

options.inJustDecodeBounds=true;

BitmapFactory.decodeFile(filePath, options);

intoldHeight = options.outHeight;

intoldWidth = options.outWidth;

// Log.i(TAG, “高度是:” + oldHeight + “,宽度是:” + oldWidth);

intratioHeight = oldHeight / newHeight;

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图