Android图片显示详解(一)

说明:

本讲义分为三部分,较为详细的介绍了Android平台下图片显示,加载等操作的处理原则与办法,以供大家共同学习,转载请注明出处 “From 移动微技”。

前提与解释:

安卓平台作为一款移动端的应用操作平台,其内存容量是十分有限的,内存资源是十分珍贵的,是无法与传统的桌面平台相比的,因此,在安卓平台下同样的图片操作与处理都要十分谨慎,否则你的程序可以迅速地消耗可用内存的预算,最终由于OutOfMemory导致程序崩溃掉。以下有三个原因说明了我们为什么要谨慎:

(1)安卓平台下对应用可使用的系统资源都做出了限制,标准安卓系统下,一个应用程序可用的最大内存为16M,一些第三方ROM

可能会上调这一限制,但是作为应用来说一定要控制自己的内存用量,这并不是可以无限制使用的。

(2)一张高分辨图片的内容耗用量是惊人的,例如,Galaxy

Nexus的摄像头在拍摄2592X1936像素(5百万像素)。如果位图使用

的是配置ARGB_8888(默认的Android

2.3开始),那么此图像加载到内存占用约19MB的内存(2592 * 1936 * 4字节),直接就耗

尽了在某些设备上的每个应用程序的内存上限。

(3)安卓应用程序的一些控件经常需要几个位图一起加载。例如ListView,GridView,ViewPager等控件,并且在使用中还要快速

的滑动,要及时对图片进行更新与回收,更加增加了图片处理的难度。

解决办法:

一,如何去加载与显示大图:

其实,在安卓这样内存有限的平台上,是没有必要按照原始尺寸把一张大图完全加载进来的,只需要加载与我们显示控件相匹配的尺寸就行,多了只会浪费我们宝贵的内存。因此在加载图片时,我们按照我们需要显示的大小对原始图片再采样就OK了。同时我们也可以根据我们所能够使用的内存大小来对图片进行解码,按照我们能够承受的尺寸与分辨率来处理,保证图片所占用的内存在我们可支配的范围之内,也就避免了OOM的问题。

第一步:我们需要获取原始图片的相关尺寸,分辨率等数据

可以利用BitmapFactory的Options来达到这一目的,解码图片时可以先把inJustDecodeBounds的值设为true,这样并没有真正的去解码图片,不占用内存,但是我们却可以在这个过程中获取图片的宽,高以及类型,代码如下:

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;

第二步:获取原始的图片尺寸后,根据目标计算缩放比例系数,代码如下:

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;

int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {

// Calculate ratios of height and width to requested height and width

final int heightRatio = Math.round((float) height / (float) reqHeight);

final int widthRatio = Math.round((float) width / (float) reqWidth);

// Choose the smallest ratio as inSampleSize value, this will guarantee

// a final image with both dimensions larger than or equal to the

// requested height and width.

inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;

}

return inSampleSize;

}官方文档中说,inSampleSize这个属性最好是2的倍数,这样处理更快,效率更高。。。

第三步:开始对图片进行解码,代码如下:

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,

int reqWidth, int reqHeight) {

// First decode with inJustDecodeBounds=true to check dimensions

final BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

BitmapFactory.decodeResource(res, resId, options);

// Calculate inSampleSize

options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

// Decode bitmap with inSampleSize set

options.inJustDecodeBounds = false;

return BitmapFactory.decodeResource(res, resId, options);

}

注意,真正解码时需要把inJustDecodeBounds属性重置为false,这样就可以把一张十分巨大的图轻松显示在一个100x100的ImageView中了

mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

当然,你也可以用来加载显示其他来源的图片,而不是例子中资源文件中的,下一讲我们研究ListView,GridView中的多图片并发显示问题。

未完待续。。。1楼flexman09昨天 23:08我简略地看了一下,还行。

android图片展示图片,Android图片展示详解(一)相关推荐

  1. 50.深度解密五十:裂变营销(图片营销)中”图片制作”奥秘详解

    网络营销推广技术.技巧深度解密(五十)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解图片营销中的图片制作奥秘的问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. 3.敬 ...

  2. HTML5 多图片上传(前端+后台详解)

    HTML5 多图片上传(前端+后台详解) 1.参考jquery插件库 2.修改代码 3.添加的后台代码 4.删除的后台代码 1.参考jquery插件库 手机端实现多图片上传 2.修改代码 我发现他这里 ...

  3. java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解

    文章目录 前言 一.直接上代码 1. 写字方法 2. 换行算法 二. 叙述换行算法 前言 代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门:https://github.com ...

  4. js截取图片 裁剪图片之cropper.js插件用法详解

    js截取图片 裁剪图片之cropper.js插件用法详解 源码:https://github.com/fengyuanchen/cropper 引入+使用 <link href="/p ...

  5. Js获取图片主色调,近似色,互补色,以及根据图片颜色获取主题配色方案详解、插件。

    Js获取图片主色调,近似色,互补色,以及根据图片颜色获取主题配色方案详解.插件. **应用场景:**在很多时候,前端开发过程中需要动态的获取图片的主要的颜色值,并根据主色调去调整主题样式的颜色或者模拟 ...

  6. python公众号留言功能详情_Python实现的微信公众号群发图片与文本消息功能实例详解...

    本文实例讲述了Python实现的微信公众号群发图片与文本消息功能.分享给大家供大家参考,具体如下: 在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_ ...

  7. 3种Javascript图片预加载的方法详解

    3种Javascript图片预加载的方法详解 预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度. 这对图片画廊及图片占据很大比例 ...

  8. android组件用法说明,Android第三方控件PhotoView使用方法详解

    Android第三方控件PhotoView使用方法详解 发布时间:2020-10-21 15:06:09 来源:脚本之家 阅读:74 作者:zhaihaohao1 PhotoView的简介: 这是一个 ...

  9. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  10. Android 各大厂面试题汇总与详解(持续更新)

    介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...

最新文章

  1. R语言ggplot2可视化在可视化的接种中插入图片、添加图片实战
  2. 数组常见的遍历循环方法、数组的循环遍历的效率对比
  3. 训练生成对抗网络的过程中,训练gan的地方为什么这里没有detach,怎么保证训练生成器的时候不会改变判别器
  4. CodeForces - 786C——二分+模拟?
  5. delphi 执行长时间存储过程 显示进度_项目管理_十大管理体系之「项目进度管理」知识整理及心得分享...
  6. eBPF 学习路径总结
  7. JSR-330 依赖注入
  8. 数据结构—二叉树的遍历
  9. 手机 — oppo手机录音放在哪个文件夹里
  10. java并发队列之DelayQueue
  11. R语言金融波动率建模|基于SGED分布的变参数ARIMA+EARCH动态预测模型的研究
  12. 显示器知识:分辨率1080P、2K、4K、8K相关知识介绍,看完你就懂了!
  13. python问卷星 自动答题_问卷星自动答题神器
  14. 计算机网络(二)---物理层与数据链路层
  15. 给到工作的你诗和远方~
  16. 自媒体视频如何消重?批量处理去重消重去水印去logo软件企鹅号视频不重复必学的消重技巧...
  17. 力天创见客流方案分析
  18. 面向对象综合训练综合练习
  19. c语言常见错误分析和程序调试,C语言中常见错误分析及程序调试
  20. ResourceManager高可用性---官网谷歌翻译

热门文章

  1. carbide.c++ 插件开发入门(转)
  2. CMake编译OpenGL SuperBible 7th源码报警告
  3. TGN:Temporal Graph Networks for Deep Learning on Dynamic Graphs
  4. Win10家庭版安装 VirtualBox
  5. 微信小程序PHP 改变小程序码中间logo的方法
  6. python写字_python 实现PIL模块在图片画线写字
  7. 数据分析师,BI开发人员,数据科学家和数据工程师的角色
  8. Revit 编辑生成复合墙
  9. 【转】扁平化时代,被OTT抑或是一种幸福
  10. 超融合市场谁主沉浮?