关于Android 中 Options.inSampleSize怎么用

转自:https://zhidao.baidu.com/question/2204559676913369588.html

这个是读取bitmap时用到的属性,是为了对原图降采样.

比如原图是一个 4000 * 4000 点阵的图,占用内存就是 4000 * 4000 * 单个像素占用字节数

单个像素占用字节数取决于你用的是 RGB565, ARGB8888 等. 4000 * 4000 这个解析度已很接近目前市面主流机器的默认照片解析度.

假设你用的是RGB565解析这张图,那一个点就占用2个字节.如果完整解析这个图片,就需要 大约3.2MB的内存.

如果你用了一个GridView,同时显示了30张这种图,那几乎可以确定你会收到一个OOM异常.

所以需要对这种大图进行降采样,以减小内存占用.毕竟拇指大小的地方根本用不着显示那么高的解析度.

因为直接从点阵中隔行抽取最有效率,所以为了兼顾效率, inSampleSize 这个属性只认2的整数倍为有效.

比如你将 inSampleSize 赋值为2,那就是每隔2行采1行,每隔2列采一列,那你解析出的图片就是原图大小的1/4.

这个值也可以填写非2的倍数,非2的倍数会被四舍五入.

综上,用这个参数解析bitmap就是为了减少内存占用.

一下是我的一个根据指定大小对图片文件降采样读取的一个函数,供参考.

/**

* author: liuxu

* de-sample according to given width and height. if required width or height is

* smaller than the origin picture's with or height, de-sample it.

* NOTE: if image quality is your first concern, do not use this method.

* @param path full path for the picture

* @param width the required width

* @param height the required height

* @return bitmap

*/

public static Bitmap decodeBitmapForSize(String path, int width, int height) {

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

if (width != 0 && height != 0) {

// decode with inJustDecodeBounds=true to check size

options.inJustDecodeBounds = true;

BitmapFactory.decodeFile(path, options);

// calculate inSampleSize according to the requested size

options.inSampleSize = calculateInSampleSize(options, width, height);

options.inJustDecodeBounds = false;

}

// decode bitmap with the calculated inSampleSize

options.inPreferredConfig = Config.RGB_565;

options.inPurgeable = true;

options.inInputShareable = true;

return BitmapFactory.decodeFile(path, options);

}

/**

* author: liuxu

* de-sample according to given width and height

* @param options options

* @param reqWidth the required width

* @param reqHeight the required height

* @return the calculated sample size

*/

private 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 initSize = 1;

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

if (width > height) {

initSize = Math.round((float) height / (float) reqHeight);

} else {

initSize = Math.round((float) width / (float) reqWidth);

}

}

/*

* the function rounds up the sample size to a power of 2 or multiple of 8 because

* BitmapFactory only honors sample size this way. For example, BitmapFactory

* down samples an image by 2 even though the request is 3.

*/

int roundedSize;

if (initSize <= 8) {

roundedSize = 1;

while (roundedSize < initSize) {

roundedSize <<= 1;

}

} else {

roundedSize = (initSize + 7) / 8 * 8;

}

return roundedSize;

}

你可能感兴趣的:(关于Android 中 Options.inSampleSize怎么用)