高效地加载图片(一) 高效地加载大图
1.Read Bitmap Dimensions and Type 读取图片的尺寸和类型
//创建一个Options,用于保存图片的参数 BitmapFactory.Options options = new BitmapFactory.Options(); //设置是否只读取图片的参数信息 options.inJustDecodeBounds = true; //由于inJustDecodeBounds被设置为了true,此处只会获得图片的参数信息 //而不会读取到Bitmap对象,也就不会占用内存 BitmapFactory.decodeResource(getResources(), R.id.myimage, options); //获得图片的宽高以及类型 int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType;
为了避免java.lang.OutOfMemory异常,在将一张图片解析为Bitmap对象之前,一定要检查它的尺寸.
2.Load a Scaled Down Version into Memory 加载经过缩放的图片到内存中
既然我们已经知道了图片的尺寸,我们就知道是否有必要将原图加载到内存中.我们可以有选择的将图片经过缩放后再加载到内存中.
需要考虑的因素有以下几点:
1.预估加载原图需要的内存大小
2.你愿意给这张图片分配的内存大小
3.要显示这张图片的控件的尺寸大小
4.手机屏幕的大小以及当前设备的屏幕密度
举例说明,如果你想要显示一张128×96像素的缩略图,则加载一张1024×768像素的图片是没有必要的.
为了告诉解码器去加载一张经过缩放的图片,需要设置BitmapFactory.Options的inSampleSize参数.
例如:一张图片的原始大小是2048×1536,如果将inSampleSize设置为4,则此时加载的图片大小为512×384,加载经过缩放后的图片只需要0.75MB的内存控件而不是加载全图时需要的12MB.
以下是一个计算inSampleSize的方法:
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {// Raw height and width of image// 图片的原始宽高final int height = options.outHeight;final int width = options.outWidth;// 默认缩放比例为1int inSampleSize = 1;// 如果原始宽高其中之一大于指定的宽高,则需要计算缩放比例// 否则,直接使用原图if (height > reqHeight || width > reqWidth) {// 将图片缩小到一半final int halfHeight = height / 2;final int halfWidth = width / 2;// Calculate the largest inSampleSize value that is a power of 2 and keeps both// height and width larger than the requested height and width.// 计算inSampleSize的值,该值是2的次方,并且能够保证图片的宽高大于指定的宽高while ((halfHeight / inSampleSize) > reqHeight&& (halfWidth / inSampleSize) > reqWidth) {inSampleSize *= 2;}}return inSampleSize;
}
要想使用上述方法,首先要讲inJustDecodeBounds设置为true,读取到图片的尺寸信息,再经过计算得到的inSampleSize去解析图片
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,int reqWidth, int reqHeight) {// First decode with inJustDecodeBounds=true to check dimensions// 此处将inJustDecodeBounds设置为true,则只解析图片的尺寸等信息,而不生成Bitmapfinal BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeResource(res, resId, options);// Calculate inSampleSize// 此处计算需要的缩放值inSampleSizeoptions.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);// Decode bitmap with inSampleSize set//将inJustDecodeBounds设置为false,以便于解析图片生成Bitmapoptions.inJustDecodeBounds = false;return BitmapFactory.decodeResource(res, resId, options);
}
转载于:https://www.cnblogs.com/chenchong/p/3692554.html
高效地加载图片(一) 高效地加载大图相关推荐
- LIstview滑动时不加载图片,停止时加载!
//参照 http://blog.csdn.net/yy1300326388/article/details/45153813 public class CarWashDistanceAdapter ...
- android viewpager动态加载图片,Android使用ViewPager加载图片和轮播视频
作为Android基础组件之一,大家对viewpager已经很熟悉了,网上也有很多使用viewpager来加载图片的案例.但是像微信那样点击图片,可以轮播显示图片和视频的例子却没找到.正巧项目中有需求 ...
- ajax静态加载图片,JQuery实现Ajax加载图片的方法
本文实例讲述了JQuery实现Ajax加载图片的方法.分享给大家供大家参考,具体如下: 最近在学习JQuery,想从原理上模拟一下无刷新的相册浏览. 最先想到的思路是利用缓存,也就是先显示提示消息,然 ...
- 加载图片出错时,加载其他图片
这个用到 onerror 事件. onerror 事件会在文档或图像加载过程中发生错误时被触发. 加载页面时,如果加载logo.png错误,就会加载logo2.png <img src=&quo ...
- python怎么加载图片-怎样用python加载dicom图片
用python加载dicom图片的方法:使用pydicom.CV2.numpy.matplotlib等库即可.pydicom库是专门用来处理dicom图像的python专用库. python读取DIC ...
- android webview 加载图片一直显示正在加载中
今天无意间发现自己的项目WebView加载时,没有调用到onPageFinished,部分图片一直显示加载中,找了老久不知道出现什么问题~~~ 无奈之下拿出老版本测试,发现加载很正常,只好把代码拿出来 ...
- ios label html图片,iOS UILabel与UITextView加载图片富文本点击看大图
背景: 功能:回复列表 要求:界面按UI给的效果图 收到的数据:带各种标签的html格式的字符串(包括web端的表情图片) 如果只是想简单的加载HTML(包括图片),点击这里. 解决方案:UILabe ...
- java怎么将加载图片消除_Java中加载图片的方法
Java中添加图片,我知道有两种方法 用new ImageIcon("地址")函数,将图片放到JLabel中,然后把JLabel放到需要的地方就可以了 ImageIcon bg=n ...
- canvas笔记-canvas加载图片及放缩及加水印(两canvas同时使用)
首先是图片放缩 程序运行截图如下: 拉动滑动条: 源码如下: <!DOCTYPE html> <html lang="en"> <head>&l ...
最新文章
- 计算机类自主招生推荐信,自主招生推荐信范文-20210709232503.docx-原创力文档
- Leetcode#43Multiply Strings
- mysql 查询任务_mysql中怎样显示服务器正在执行的sql任务
- WinAPI: waveOutGetErrorText - 根据错误号得到错误描述
- 最可怕的企业“内卷化”,是走入以下10个误区而不自知
- (24)VHDL实现与或非(行为描述)
- 一个低时延高吞吐的日志方案设计-2021年6月4日
- Java Swing 如何关闭当前窗口?
- python 连接 mysql
- python下视频的包_这套Python视频超详细,包你一小时就可开始入门,100天在编程界驰骋~...
- 超详细!在我的世界(MC)中使用cocricot模组搭建一个咖啡厅
- 动手实现图像双线性插值——实现图像resize
- Unity shader入门精要-第一章笔记
- 推荐Ubuntu使用UML工具-Drawio
- java继承序列化_Java中具有继承的对象序列化
- 如何获取微信公众号的关注链接?
- 纯CSS实现圆角阴影的折角效果
- 人行征信报告学习经验
- 迎难而上,阿里高频考点2023Java岗面试突击手册
- 自己动手做个智能小车(1)
热门文章
- 把“血”注入到产品里
- JZOJ 3453【NOIP2013中秋节模拟】连通块
- 湖北沙洋中学2021年6月高考成绩查询,2021年荆门中考分数线公布填报志愿时间及录取结果什么时候出...
- case when else 默认随机_SQL高级知识——CASE的用法
- python实现ping某一ip_Python实现ping指定IP的示例
- ipad和android平板应用程序,Android平板要比iPad差吗?
- 面向对象发牌Java_面向对象思路的斗地主发牌小程序
- 关于vue.js的部分总结
- [bzoj 5332][SDOI2018]旧试题
- MySQL中的事务日志