【幻化万千戏红尘】qianfeng-Android-Day20_Bitmap二次采样
来源:互联网 发布:中日翻译软件 编辑:程序博客网 时间:2024/04/27 17:30
Bitmap二次采样
一、二次采样:
(一)、意义或目的:
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是解决该问题的关键之一。
核心代码:
/**
* Bitmap二次采样工具类
*/
public class BitmapUtil {
public static Bitmap getBitmap(String filePath,int destWidth, intdestHeight) {
//第一采样
BitmapFactory.Options options =new BitmapFactory.Options();
options.inJustDecodeBounds= true;
BitmapFactory.decodeFile(filePath, options);
int outWidth = options.outWidth;
int outHeight = options.outHeight;
int sampleSize =1;
while ((outWidth / sampleSize > destWidth) || (outHeight / sampleSize > destHeight)) {
sampleSize *= 2;
}
//第二次采样
options.inJustDecodeBounds= false;
options.inSampleSize = sampleSize;
options.inPreferredConfig = Bitmap.Config.RGB_565;
return BitmapFactory.decodeFile(filePath, options);
}
}
二、Bitmap占用内存的计算:
(一)、概述:
Android中一张图片(Bitmap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数。一张图片(Bitmap)占用的内存=图片长度*图片宽度*单位像素占用的字节数注:图片长度和图片宽度的单位是像素。图片(Bitmap)占用的内存和屏幕密度(Density)无关。
创建一个Bitmap时,其单位像素占用的字节数由其参数BitmapFactory.Options的inPreferredConfig变量决定。
(二)、inPreferredConfig属性简介
inPreferredConfig为Bitmap.Config类型,Bitmap.Config类是个枚举类型,它可以为以下值 Enum Values:
1、Bitmap.Config ALPHA_8 :
· 此时图片只有alpha值,没有RGB值,一个像素占用一个字节 。
2、Bitmap.Config ARGB_4444 :
· 这种格式的图片,看起来质量太差,已经不推荐使用。而强烈推荐使用ARGB_8888来代替。
· 一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites 。 共16bites,即2个字节。
3、Bitmap.Config ARGB_8888:
· 一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bites , 共32bites , 即4个字节。这是一种高质量的图片格式,电脑上普通采用的格式。它也是Android手机上一个bitmap的默认格式。
4、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:
o 图片长度*图片宽度
o 100*100=10000字节
· ARGB_4444:
o 图片长度*图片宽度*2
o 100*100*2=20000字节
· ARGB_8888:
o 图片长度*图片宽度*4
o 100*100*4=40000字节
· RGB_565:
o 图片长度*图片宽度*2
o 100*100*2=20000字节
- 【幻化万千戏红尘】qianfeng-Android-Day20_Bitmap二次采样
- 【幻化万千戏红尘】qianfeng-Android-Day20_Handler_Looper_MessageQueue
- 【幻化万千戏红尘】qianfeng-Android-Day20_LruCache
- 【幻化万千戏红尘】qianfeng-Android-Day18_Fragment
- 【幻化万千戏红尘】qianfeng-Android-Day17_ViewPager
- 【幻化万千戏红尘】qianfeng-Android-Day13_SQLiteOpenHelper
- 【幻化万千戏红尘】qianfeng-Android-Day13_SQLiteDataBases
- 【幻化万千戏红尘】qianfeng-Android-Day07-AsyncTask基础学习:
- 【幻化万千戏红尘】qianfeng-Android-Day08-基础学习:ListView
- 【幻化万千戏红尘】qianfeng-Android-Day19_导航栏制作
- 【幻化万千戏红尘】qianfeng-Android-Day16动画
- 【幻化万千戏红尘】qianfeng-Android-Day11_Menu、ContextMenu、Dialog、PopupWindow
- 【幻化万千戏红尘】qianfeng-JAVA课程结束总结
- 【幻化万千戏红尘】qianfeng-Android-Day01-安卓历史及环境的搭建基础学习:
- 【幻化万千戏红尘】qianfeng-Android-Day01-历史、环境搭建、VIEW属性、LinearLayout详解基础学习
- 【幻化万千戏红尘】qianfeng-Android-Day02-RelativeLayout布局、TextView、EditText、imageView基础学习
- 【幻化万千戏红尘】qianfeng-Android-Day03-RadioButton及RadioGroup的用法、CheckBox、ProgressBar基础学习:
- 【幻化万千戏红尘】qianfeng-Android-Day04-Spinner、ScrollVie、AutoCompleteTextView,Activity初步认识基础学习:
- 线程间通信
- 【幻化万千戏红尘】qianfeng-Android-Day19_导航栏制作
- C++实现单链表的逆置
- maven报错:Check $M2_HOME environment variable and mvn script match.
- 2016.09.17【初中部 NOIP提高组 】模拟赛C
- 【幻化万千戏红尘】qianfeng-Android-Day20_Bitmap二次采样
- Fresco第三方框架加载图片教程介绍
- NOIP2016提高A组模拟9.17
- 对于Java转型的一些个人理解
- Android Broadcast Receiver
- 编程语言 - 常量和变量
- 51nod 1118 机器人走方格(组合数【逆元】,dp)
- CF - 500A New Year Transportation(查找位置)
- Codeforces713C-Sonya and Problem Wihtout a Legend(dp + 离散化)