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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Windows 技术篇-LDSGameMaster文件夹有什么用,删除方法

    Windows 技术篇-LDSGameMaster文件夹有什么用,删除方法LDS是鲁大师的拼写,应该是用过鲁大师,偷偷给你安装的。分析:没什么用,流氓程序,还很大占地方,4个G,可以放心的卸掉。卸载方法:找到里面的卸载程序来卸载,卸载完后把文件夹删除就好了。

    2022年6月14日
    125
  • 面向对象之封装

    封装封装的定义隐藏对象的属性和实现细节,仅对外提供公共访问方式。封装的好处1.将变化隔离;2.便于使用;3.提高复用性;4.提高安全性;封装的原则1.将不需要对外提供的内容

    2022年3月29日
    47
  • leetcode难度级别_直线上最多的点数

    leetcode难度级别_直线上最多的点数给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。示例 1:输入: [[1,1],[2,2],[3,3]]输出: 3解释:^|| o| o| o +————->0 1 2 3 4示例 2:输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]输出: 4解释:^|| o| o o| o| o o+—–

    2022年8月9日
    7
  • 使用 HTML、CSS 和 JS 的简单倒数计时器[通俗易懂]

    使用 HTML、CSS 和 JS 的简单倒数计时器[通俗易懂]JavaScript倒数计时器用于各种电子商务和建设中的网站,以使用户保持最新状态。我们在不同类型的电子商务网站上看到,在任何产品或优惠到达之前的某个时间开始倒计时。在本文中,我使用简单的JavaScript代码创建了一个倒数计时器和你分享。您可以观看它的现场演示以了解它是如何工作的。如果您知道如何创建数字时钟,那么创建这样的项目就会容易得多。您可以在此处提前安排特定日期或时间。然后,在JavaScript代码的帮助下,从那个时间减去当前时间,减法每秒减少一次。正如您在上图中所看到的,我在这

    2022年7月19日
    15
  • Winform基础控件美化

    Winform基础控件美化这段时间重写了Winform的TextBox,ComboBox,NumericUpDown,DateTimePicker(还在实现中),Panel,Button控件主要实现了,这些控件的垂直居中,可自定义边框颜色等功能,支持fontawesome图标.效果见下图项目目录见下图Common是公共方法Control为继承类控件包括Button,Panel,(DateTime…

    2022年5月10日
    43
  • python基础(2)字符串常用方法「建议收藏」

    python基础(2)字符串常用方法「建议收藏」python字符串常用方法find(sub[,start[,end]])在索引start和end之间查找字符串sub​找到,则返回最左端的索引值,未找到,则返回-1​start和end都可

    2022年7月29日
    5

发表回复

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

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