BitmapFactory.Options详解


public Bitmap html

inBitmap android

If set, decode methods that take the Options object will attempt to reuse this bitmap when loading content. windows

public int post

inDensity this

The pixel density to use for the bitmap. spa

public boolean .net

inDither code

If dither is true, the decoder will attempt to dither the decoded image. htm

public boolean 图片

inInputShareable

This field works in conjuction with inPurgeable.

public boolean

inJustDecodeBounds

If set to true, the decoder will return null (no bitmap), but the out…

public boolean

inMutable

If set, decode methods will always return a mutable Bitmap instead of an immutable one.

public boolean

inPreferQualityOverSpeed

If inPreferQualityOverSpeed is set to true, the decoder will try to decode the reconstructed image to a higher quality even at the expense of the decoding speed.

publicBitmap.Config

inPreferredConfig

If this is non-null, the decoder will try to decode into this internal configuration.

public boolean

inPurgeable

If this is set to true, then the resulting bitmap will allocate its pixels such that they can be purged if the system needs to reclaim memory.

public int

inSampleSize

If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory.

public boolean

inScaled

When this flag is set, if inDensity and inTargetDensity are not 0, the bitmap will be scaled to match inTargetDensity when loaded, rather than relying on the graphics system scaling it each time it is drawn to a Canvas.

public int

inScreenDensity

The pixel density of the actual screen that is being used.

public int

inTargetDensity

The pixel density of the destination this bitmap will be drawn to.

public byte[]

inTempStorage

Temp storage to use for decoding.

public boolean

mCancel

Flag to indicate that cancel has been called on this object.

public int

outHeight

The resulting height of the bitmap, set independent of the state of inJustDecodeBounds.

public String

outMimeType

If known, this string is set to the mimetype of the decoded image.

public int

outWidth

The resulting width of the bitmap, set independent of the state of inJustDecodeBounds.

这个表格是从android sdk文档里摘出来的,简单看一下说明就明白是什么意思了。
下面咱们回到咱们的主题上来:怎样获取图片的大小?
思路很简单:
首先咱们把这个图片转成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了。
示例代码以下:

  1. BitmapFactory.Options options = new BitmapFactory.Options();
  2. options.inJustDecodeBounds = true;
  3. Bitmap bmp = BitmapFactory.decodeFile(path, options);
  4. /* 这里返回的bmp是null */

复制代码

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

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

  1. /* 计算获得图片的高度 */
  2. /* 这里须要主意,若是你须要更高的精度来保证图片不变形的话,须要本身进行一下数学运算 */
  3. int height = options.outHeight * 200 / options.outWidth;
  4. options.outWidth = 200;
  5. options.outHeight = height; 
  6. /* 这样才能真正的返回一个Bitmap给你 */
  7. options.inJustDecodeBounds = false;
  8. Bitmap bmp = BitmapFactory.decodeFile(path, options);
  9. image.setImageBitmap(bmp);

复制代码

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

  1. inSampleSize = options.outWidth / 200;

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

  1. options.inPreferredConfig = Bitmap.Config.ARGB_4444;    // 默认是Bitmap.Config.ARGB_8888
  2. /* 下面两个字段须要组合使用 */
  3. options.inPurgeable = true;
  4. options.inInputShareable = true;
相关文章
相关标签/搜索