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

高效地加载图片(一) 高效地加载大图相关推荐

  1. LIstview滑动时不加载图片,停止时加载!

    //参照 http://blog.csdn.net/yy1300326388/article/details/45153813 public class CarWashDistanceAdapter ...

  2. android viewpager动态加载图片,Android使用ViewPager加载图片和轮播视频

    作为Android基础组件之一,大家对viewpager已经很熟悉了,网上也有很多使用viewpager来加载图片的案例.但是像微信那样点击图片,可以轮播显示图片和视频的例子却没找到.正巧项目中有需求 ...

  3. ajax静态加载图片,JQuery实现Ajax加载图片的方法

    本文实例讲述了JQuery实现Ajax加载图片的方法.分享给大家供大家参考,具体如下: 最近在学习JQuery,想从原理上模拟一下无刷新的相册浏览. 最先想到的思路是利用缓存,也就是先显示提示消息,然 ...

  4. 加载图片出错时,加载其他图片

    这个用到 onerror 事件. onerror 事件会在文档或图像加载过程中发生错误时被触发. 加载页面时,如果加载logo.png错误,就会加载logo2.png <img src=&quo ...

  5. python怎么加载图片-怎样用python加载dicom图片

    用python加载dicom图片的方法:使用pydicom.CV2.numpy.matplotlib等库即可.pydicom库是专门用来处理dicom图像的python专用库. python读取DIC ...

  6. android webview 加载图片一直显示正在加载中

    今天无意间发现自己的项目WebView加载时,没有调用到onPageFinished,部分图片一直显示加载中,找了老久不知道出现什么问题~~~ 无奈之下拿出老版本测试,发现加载很正常,只好把代码拿出来 ...

  7. ios label html图片,iOS UILabel与UITextView加载图片富文本点击看大图

    背景: 功能:回复列表 要求:界面按UI给的效果图 收到的数据:带各种标签的html格式的字符串(包括web端的表情图片) 如果只是想简单的加载HTML(包括图片),点击这里. 解决方案:UILabe ...

  8. java怎么将加载图片消除_Java中加载图片的方法

    Java中添加图片,我知道有两种方法 用new ImageIcon("地址")函数,将图片放到JLabel中,然后把JLabel放到需要的地方就可以了 ImageIcon bg=n ...

  9. canvas笔记-canvas加载图片及放缩及加水印(两canvas同时使用)

    首先是图片放缩 程序运行截图如下: 拉动滑动条: 源码如下: <!DOCTYPE html> <html lang="en"> <head>&l ...

最新文章

  1. 计算机类自主招生推荐信,自主招生推荐信范文-20210709232503.docx-原创力文档
  2. Leetcode#43Multiply Strings
  3. mysql 查询任务_mysql中怎样显示服务器正在执行的sql任务
  4. WinAPI: waveOutGetErrorText - 根据错误号得到错误描述
  5. 最可怕的企业“内卷化”,是走入以下10个误区而不自知
  6. (24)VHDL实现与或非(行为描述)
  7. 一个低时延高吞吐的日志方案设计-2021年6月4日
  8. Java Swing 如何关闭当前窗口?
  9. python 连接 mysql
  10. python下视频的包_这套Python视频超详细,包你一小时就可开始入门,100天在编程界驰骋~...
  11. 超详细!在我的世界(MC)中使用cocricot模组搭建一个咖啡厅
  12. 动手实现图像双线性插值——实现图像resize
  13. Unity shader入门精要-第一章笔记
  14. 推荐Ubuntu使用UML工具-Drawio
  15. java继承序列化_Java中具有继承的对象序列化
  16. 如何获取微信公众号的关注链接?
  17. 纯CSS实现圆角阴影的折角效果
  18. 人行征信报告学习经验
  19. 迎难而上,阿里高频考点2023Java岗面试突击手册
  20. 自己动手做个智能小车(1)

热门文章

  1. 把“血”注入到产品里
  2. JZOJ 3453【NOIP2013中秋节模拟】连通块
  3. 湖北沙洋中学2021年6月高考成绩查询,2021年荆门中考分数线公布填报志愿时间及录取结果什么时候出...
  4. case when else 默认随机_SQL高级知识——CASE的用法
  5. python实现ping某一ip_Python实现ping指定IP的示例
  6. ipad和android平板应用程序,Android平板要比iPad差吗?
  7. 面向对象发牌Java_面向对象思路的斗地主发牌小程序
  8. 关于vue.js的部分总结
  9. [bzoj 5332][SDOI2018]旧试题
  10. MySQL中的事务日志