android之BitmapFactory.Options的使用

,BitmapFactory.Options的使用是在加载图片时,就从图片的加载和使用说起 怎样获取图片的大小?首先我们把这个图片转成Bitmap,然后再利用Bitmap的getWidth()和getHeight()方法就可以取到图片的宽高了。新问题又来了,在通过BitmapFactory.decodeFile(String path)方法将突破转成Bitmap时,遇到大一些的图片

大家好,又见面了,我是全栈君。

,BitmapFactory.Options的使用是在加载图片时,就从图片的加载和使用说起

 

怎样获取图片的大小?
首先我们把这个图片转成Bitmap,然后再利用Bitmap的getWidth()和getHeight()方法就可以取到图片的宽高了。
新问题又来了,在通过BitmapFactory.decodeFile(String path)方法将突破转成Bitmap时,遇到大一些的图片,我们经常会遇到OOM(Out Of Memory)的问题。怎么避免它呢?
这就用到了我们上面提到的BitmapFactory.Options这个类。

BitmapFactory.Options这个类,有一个字段叫做 inJustDecodeBounds 。SDK中对这个成员的说明是这样的:
If set to true, the decoder will return null (no bitmap), but the out…
也就是说,如果我们把它设为true,那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。
示例代码如下:

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

options.inJustDecodeBounds = true;

Bitmap bmp = BitmapFactory.decodeFile(path, options);/* 这里返回的bmp是null */

这段代码之后,options.outWidth 和 options.outHeight就是我们想要的宽和高了。

有了宽,高的信息,我们怎样在图片不变形的情况下获取到图片指定大小的缩略图呢?
比如我们需要在图片不变形的前提下得到宽度为200的缩略图。
那么我们需要先计算一下缩放之后,图片的高度是多少 ,代码如下

int height = options.outHeight * 200 / options.outWidth;

options.outWidth = 200;

options.outHeight = height; 

options.inJustDecodeBounds = false;

Bitmap bmp = BitmapFactory.decodeFile(path, options);

image.setImageBitmap(bmp);

这样虽然我们可以得到我们期望大小的ImageView
但是在执行BitmapFactory.decodeFile(path, options);时,并没有节约内存。要想节约内存,还需要用到BitmapFactory.Options这个类里的 inSampleSize 这个成员变量。
我们可以根据图片实际的宽高和我们期望的宽高来计算得到这个值。

options.inSampleSize = options.outWidth / 200; /*图片长宽方向缩小倍数*/
另外,为了节约内存我们还可以使用下面的几个字段:
options.inDither=false;    /*不进行图片抖动处理*/
options.inPreferredConfig=null;  /*设置让解码器以最佳方式解码*/

/* 下面两个字段需要组合使用 */

options.inPurgeable = true;

options.inInputShareable = true;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121437.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月10日 上午10:35
下一篇 2022年3月10日 上午10:35


相关推荐

  • 大数据治理包括哪几个方面

    大数据治理包括哪几个方面在数据治理中 涉及到了前端业务系统 后端业务数据库系统再到业务终端的数据分析 从源头到终端再回到源头 形成的一个闭环负反馈系统 同样地 在数据治理中 我们也需要一套标准化的规范来指导数据的采集 传输 储存以及应用 数据治理包括数据规划 数据采集 数据储存管理 数据应用四个方面 根据每一个方面的特点 我们可以将数据治理总结为四个字 即 理 采 存 用 01 理 梳理业务流程 规划数据资源 对于企业来说 每天的实时数据都会超过 TB 级别 需要采集用户的哪些数据 这么多的数据放

    2025年6月2日
    5
  • 最全JVM面试题

    最全JVM面试题文章目录 1 说一下 JVM 的主要组成部分及组成部分的作用 2 说一下 JVM 的作用 3 深拷贝和浅拷贝 4 说一下堆栈的区别 5 队列和栈是什么 有什么区别 1 说一下 JVM 的主要组成部分及组成部分的作用 方法区和堆是所有线程共享的内存区域 而 java 栈 本地方法栈和程序员计数器是运行是线程私有的内存区域 运行时数据区域就是我们常说的 JVM 的内存 类加载子系统 根据给定的全限定名类名 如 java lang Object 来装载 class 文件到运行时数据区中的方法区中 Java 堆

    2026年3月26日
    2
  • GigabitEthernet和Ethernet接口的区别

    GigabitEthernet和Ethernet接口的区别设备里面的 ethernet 是 100M 接口 gigabitether 是 1000M 接口 ethernet 不能配置 IP 因为这个接口是二层口 所以不能设置 IP 一 端口速率区别 1 Ethernet0 0 1 以太网端口 10Mbit s 2 FastEthernet 0 1 快速以太网端口 100Mbit s 3 GigabitEther 0 1 千兆以太网端口 1000Mbit s 二 编码区别 1 Ethernet 传统以太网 采用曼彻特斯编码 2 FastEthernet 快

    2026年3月20日
    2
  • linux开启ssh命令(linux开启端口命令)

    在使用SSH时,经常会出现用sshsecureshellclient连接linux连接不上:解决方法如下: 如果没安装ssh,其安装过程:1.以root身份登入系统(没登入系统和没有足够的权限都不能安装,晕,这不是废话)2.检查安装系统时是否已经安装SSH服务端软件包: rpm-qa|grepopenssh 若显示结果中包含openssh-serve

    2022年4月14日
    385
  • 电脑绘画入门教程_如何学习电脑绘画?电脑绘画入门教程

    电脑绘画入门教程_如何学习电脑绘画?电脑绘画入门教程如何学习电脑绘画 怎样才能学习好电脑绘画 学习好电脑绘画有哪些技巧 想必这些问题都是绘画初学者们比较伤脑筋的问题 那么到底怎样才能学习好电脑绘画呢 今天灵猫课堂老师就在网络上收集整理了关于如何学习电脑绘画 需要美术基础吗 教程非常简单 赶紧来看看叭 插画 其主要功能是将文字内容 故事或思想以视觉出现的方式呈现 对于现代插画来说 更是个一个设计专业 而非纯艺术专业 因此 其美术性 视觉性 文字内容的

    2026年3月26日
    2
  • Cocos2d-x lua游戏开发之安装Lua到mac系统

    Cocos2d-x lua游戏开发之安装Lua到mac系统

    2022年1月27日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号