BitmapFactory.Options详解 怎样获取图片的大小 遇到大一些的图片,遇到OOM(Out Of Memory)的问题

下面我们回到我们的主题上来:怎样获取图片的大小?

思路很简单:

首先我们把这个图片转成Bitmap,然后再利用Bitmap的getWidth()和getHeight()方法就可以取到图片的宽高了。

新问题又来了,在通过BitmapFactory.decodeFile(Stringpath)方法将突破转成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(Stringpath, Options opt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。 示例代码如下:

BitmapFactory.Options options = newBitmapFactory.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;

/* 这样才能真正的返回一个Bitmap给你 */

options.inJustDecodeBounds = false;

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

image.setImageBitmap(bmp);

复制代码

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

inSampleSize = options.outWidth / 200;

另外,为了节约内存我们还可以使用下面的几个字段:

options.inPreferredConfig =Bitmap.Config.ARGB_4444;    // 默认是Bitmap.Config.ARGB_8888

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

options.inPurgeable = true;

options.inInputShareable = true;

---------------------------------------------

1.BitMapFactory.decodeFile(String path) 转成BitMap,BitMap过大,也会导致OOM

2.BitMapFactory.Option 参数,返回的BitMap是空,我们可以获得BitMap的宽和高。通过计算方法计算出我们想要的宽和高

通过设置inJustDecodeBounds

3.其他的设置,options.inpreferendConfig=BitMap.Config.ARGB_4444

---------------------------------------------------

时间: 2024-10-25 21:36:45

BitmapFactory.Options详解 怎样获取图片的大小 遇到大一些的图片,遇到OOM(Out Of Memory)的问题的相关文章

BitmapFactory.Options详解

public Bitmap inBitmap If set, decode methods that take the Options object will attempt to reuse this bitmap when loading content. public int inDensity The pixel density to use for the bitmap. public boolean inDither If dither is true, the decoder wi

BitmapFactory.Options详解 -- 转载

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

Android中BitmapFactory.Options详解

在Android中,BitmapFactory相信大家都很熟悉了,这个类里面的所有方法都是用来解码创建一个Bitmap,其中有一个重要的类是Options,此类用于解码Bitmap时的各种参数控制,那这里面的各种参数都是什么含义呢?今天我们就来重点解读几个参数. inJustDecodeBounds: 如果将这个值置为true,那么在解码的时候将不会返回bitmap,只会返回这个bitmap的尺寸.这个属性的目的是,如果你只想知道一个bitmap的尺寸,但又不想将其加载到内存时.这是一个非常有用

【Objective-C】NSDate详解及获取当前时间等常用操作

NSDate类用于保存时间值,同时提供了一些方法来处理一些基于秒级别时差(Time Interval)运算和日期之间的早晚比较等. 1. 创建或初始化可用以下方法 用于创建NSDate实例的类方法有 + (id)date; 返回当前时间 + (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs; 返回以当前时间为基准,然后过了secs秒的时间 + (id)dateWithTimeIntervalSinceReferenceDate:(NSTi

详解php 获取文件名basename()函数的用法

PHP 中basename()函数给出一个包含有指向一个文件的全路径的字符串,此函数返回基本的文件名,本篇文章收集了关于使用PHP basename()函数获取文件名的几篇文章,希望对大家理解使用PHP basename()函数获取文件名有所帮助. 1.详解php basename()函数获取文件名的用法 php basename()函数给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名.如果文件名是以 suffix 结束的,那这一部分也会被去掉.在 Windows 中,斜线(/

详解CSS中:nth-child的用法_大前端

http://www.daqianduan.com/3737.html 前端的哥们想必都接触过css中一个神奇的玩意,可以轻松选取你想要的标签并给与修改添加样式,是不是很给力,它就是":nth-child". 下面我将用几个典型的实例来给大家讲解:nth-child的实际用途: Tips:还用低版本的IE浏览器的哥们请绕过! :nth-child(2)选取第几个标签,"2可以是你想要的数字" .demo01 li:nth-child(2){background:#0

spring mvc DispatcherServlet详解之---获取控制器

整个spring mvc的架构如下图所示: 现在来讲解DispatcherServletDispatcherServlet的第一步:获取控制器. HandlerMapping HandlerMappings 定义request和handler之间的映射.它的官方文档这样描述: Interface HandlerMapping All Known Implementing Classes: AbstractControllerUrlHandlerMapping, AbstractDetecting

Java Web -- Servlet(13)HttpServletRequest详解(获取请求数据、请求分派、请求域)(2)

                                    HttpServletRequest ---------------------------------------------------------------- (4)请求分派 Servlet API中定义了一个RequestDispatcher接口,俗称请求分派器. 它有两个方法 forward(ServletRequest request,ServletResponse response) include(Serv

NSDate详解及获取当前时间等常用操作

NSDate类用于保存时间值,同时提供了一些方法来处理一些基于秒级别时差(Time Interval)运算和日期之间的早晚比较等. 1. 创建或初始化可用以下方法 用于创建NSDate实例的类方法有 + (id)date; 返回当前时间 + (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs; 返回以当前时间为基准,然后过了secs秒的时间 + (id)dateWithTimeIntervalSinceReferenceDate:(NSTi