BitmapFactory中Options的使用示例
目录:
一、加载巨图 1
二、图片缓存技术 5
三 10
四、LruCache和DiskLruCache完美结合 30
一、加载巨图
我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多。大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。我们可以通过下面的代码看出每个应用程序最高可用内存是多少。
[java]?view plain?copy
int?maxMemory?=?(int)?(Runtime.getRuntime().maxMemory()?/?1024);??
Log.d(TAG,?Max?memory?is??+?maxMemory?+?KB);??
因此在展示高分辨率图片的时候,最好先将图片进行压缩。压缩后的图片大小应该和用来展示它的控件大小相近,在一个很小的ImageView上显示一张超大的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存,而且在性能上还可能会带来负面影响。下面我们就来看一看,如何对一张大图片进行适当的压缩,让它能够以最佳大小显示的同时,还能防止OOM的出现。
BitmapFactory这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象,我们应该根据图片的来源选择合适的方法。比如SD卡中的图片可以使用decodeFile方法,网络上的图片可以使用decodeStream方法,资源文件中的图片可以使用decodeResource方法。这些方法会尝试为已经构建的bitmap分配内存,这时就会很容易导致OOM出现。为此每一种解析方法都提供了一个可选的BitmapFactory.Options参数,将这个参数的inJustDecodeBounds属性设置为true就可以让解析方法禁止为bitmap分配内存,返回值也不再是一个Bitmap对象,而是null。虽然Bitmap是null了,但是BitmapFactory.Options的outWidth、outHeight和outMimeType属性都会被赋值。这个技巧让我们可以在加载图片之前就获取到图片的长宽值和MIME类型,从而根据情况对图片进行压缩。如下代码所示:
[java]?view plain?copy
BitmapFactory.Options?options?=?new?BitmapFactory.Options();??
options.inJustDecodeBounds?=?true;??
BitmapFactory.decodeResource(getResources(),?R.id.myimage,?options);??
int?imageHeight?=?options.outHeight;??
int?imageWidth?=?options.outWidth;??
String?imageType?=?options.outMimeType;??
为了避免OOM异常,最好在解析每张图片的时候都先检查一下图片的大小,除非你非常信任图片的来源,保证这些图片都不会超出你程序的可用内存。
现在图片的大小已经知道了,我们就可以决定是把整张图片加载到内存中还是加载一个压缩版的图片到内存中。以下几个因素是我们需要考虑的:
预估一下加载整张图片所需占用的内存。
为了加载这一张图片你所愿意提供多少内存。
用于展示这张图片的控件的实际大小。
当前设备的屏幕尺寸和分辨率。
比如,你的ImageView只有128*96像素的大小,只是为了显示一张缩略图,这时候把一张1024*768像素的图片完全加载到内存中显然是不值得的。
那我们怎样才能对图片进行压缩呢?通过设置BitmapFactory.Options中inSampleSize的值就可以实现。比如我们有一张2048*1536像素的图片,将inSampleSize的值设置为4,就可以把这张图片压缩成512*384像素。原本加载这张图片需要占用13M的内存,压缩后就只需要占用0.75M了(假设图片是ARGB_8888类型,即每个像素点占用4个字节)。下面的方法可以根据传入的宽和高,计算出合适的inSampleSize值:
[java]?view plain?copy
public?static?int?calculateInSampleSize(BitmapFactory.O
您可能关注的文档
- 五大领域与幼儿学习发展.ppt
- 五、英国脱欧对世界政治、经济格局及欧盟的影响.ppt
- 五小水利施工组织设计.doc
- 6谷物干燥贮藏及其精米设施.ppt
- 投影的基本知识.ppt
- 把握趋势,势在必然.ppt
- ahx_企业业绩管理与人才激励.ppt
- 6语文《黄河颂》优秀教案.ppt
- 五年级-丝绸之路ppt课件.ppt
- 五年级上册 简易方程.doc
- 2026上海银行博士后研究人员招聘3人备考题库带答案详解(完整版).docx
- 2026中国农业科学院农业信息研究所科技情报分析与评估创新团队博士后研究人员招收1人备考题库含答案详.docx
- 2026中信银行蚌埠分行社会招聘备考题库含答案详解(培优b卷).docx
- 2026中国人民武装警察部队湖南省总队医院社会招聘16人备考题库带答案详解(满分必刷).docx
- 2026中国科学院分子植物科学卓越创新中心分子植物卓越中心周济研究组招聘博士后备考题库附答案详解(综.docx
- 2026中信银行博士后研究人员招聘备考题库含答案详解(培优).docx
- 2026中国中医科学院针灸研究所面向社会招聘5人备考题库附参考答案详解ab卷.docx
- 2026云南临沧沧源佤族自治县人民检察院公益性岗位人员招聘3人备考题库附答案详解(黄金题型).docx
- 2026中共宁夏区委党校(宁夏行政学院)自主招聘教师10人备考题库及答案详解(基础+提升).docx
- 2026上海市盲童学校招聘9人备考题库含答案详解(典型题).docx
原创力文档

文档评论(0)