Bitmap二次采样

原创 2016年08月29日 15:23:44

一、二次采样:
(一)、意义或目的:

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

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

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

例如:

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

opts.inSampleSize = 4;

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


(二)、获取inSampleSize:
设置恰当的inSampleSize是解决该问题的关键之一。
查看Android源码,我们得知,为了得到恰当的inSampleSize,Android提供了一种动态计算的方法。

1、核心代码:

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 ? ratioWidth
: ratioHeight;
options.inPreferredConfig = Config.RGB_565;

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 :
Each pixel is stored as a single translucency (alpha) channel. This is very useful to efficiently store masks for instance. No color information is stored. With this configuration, each pixel requires 1 byte of memory.
此时图片只有alpha值,没有RGB值,一个像素占用一个字节 。

2、Bitmap.Config ARGB_4444 :
This field is deprecated. Because of the poor quality of this configuration, It is advised to use ARGB_8888 instead.
这种格式的图片,看起来质量太差,已经不推荐使用。 而强烈推荐使用ARGB_8888来代替。
Each pixel is stored on 2 bytes. The three RGB color channels and the alpha channel (translucency) are stored with a 4 bits precision (16 possible values.) This configuration is mostly useful if the application needs to store translucency information but also needs to save memory. It is recommended to use ARGB_8888 instead of this configuration.
一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites 。 共16bites,即2个字节。

3、Bitmap.Config ARGB_8888:
Each pixel is stored on 4 bytes. Each channel (RGB and alpha for translucency) is stored with 8 bits of precision (256 possible values.) This configuration is very flexible and offers the best quality. It should be used whenever possible。
一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bites , 共32bites , 即4个字节。这是一种高质量的图片格式,电脑上普通采用的格式。它也是Android手机上一个BitMap的默认格式。

4、Bitmap.Config RGB_565:
Each pixel is stored on 2 bytes and only the RGB channels are encoded: red is stored with 5 bits of precision (32 possible values), green is stored with 6 bits of precision (64 possible values) and blue is stored with 5 bits of precision. This configuration can produce slight visual artifacts depending on the configuration of the source. For instance, without dithering, the result might show a greenish tint. To get better results dithering should be applied. This configuration may be useful when using opaque bitmaps that do not require high color fidelity.
一个像素占用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_4444:
图片长度*图片宽度*2
100*100*2=20000字节
ARGB_8888:
图片长度*图片宽度*4
100*100*4=40000字节
RGB_565:
图片长度*图片宽度*2
100*100*2=20000字节

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

大位图二次采样压缩解决Bitmap OOM

有时候你不注意位图可以快速地消耗你的可用内存的预算导致应用程序崩溃由于可怕的例外。这就是我们长看到的 java.lang.OutofMemoryError: bitmap size exceeds V...
  • kluing
  • kluing
  • 2015年03月03日 22:13
  • 882

Android开发之Bitmap二次采样

1.Bitmap概述 Android系统支持几种图片(.png (preferred), .jpg (acceptable), .gif (discouraged)), 其中Bitmap位图...

BitMap 二次采样工具类

public class BitmapUtils { /** * * @param img 即你要获得图片的控件 * @param path 即你要从网络上获取的...

bitmap 二次采样

Bitmap二次采样 一、二次采样: (一)、意义或目的:  1、用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,...

Bitmap二次采样以及压缩另一种方式

文字转载自:http://blog.csdn.net/jian51868/article/details/45225445 感谢原博主无私分享。最近,做到电子照片上传的功能,要求照片大小不能大于50...

Android开发之Bitmap二次采样

Bitmap二次采样,听着好像是一个高大上的事,其实也就那么回事,今天我们就来看看Bitmap的二次采样问题。1.为什么要二次采样OK,那么首先我要 解决的一个问题就是为什么我们要二次采样?不知道大家...

Android开发之Bitmap二次采样

Android开发之Bitmap二次采样 标签: androidBitmap二次采样 2016-04-25 21:31 1374人阅读 评论(0) 收藏 举报  分类: htt...

Bitmap 二次采样

一、二次采样: (一)、意义或目的:  1、用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。Bitm...

Android_Bitmap_图片的二次采样并生成缩略图

首先尝试通过字节数组或者流,只去加载图片的外边缘,此时必须指定BitmapFactory.Options 的inJustDecodeBounds成员名,将其只为true,一旦设置为true,Bitma...
  • kazeik
  • kazeik
  • 2013年12月19日 21:30
  • 4017

Bitmap 二次采样实现

本博文为转载,原创地址: http://blog.csdn.net/zimo2013/article/details/168494771.Bitmap概述 Android系统支持几种图片(.png...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bitmap二次采样
举报原因:
原因补充:

(最多只允许输入30个字)