永发信息网

关于Android 中 Options.inSampleSize怎么用

答案:1  悬赏:30  手机版
解决时间 2021-11-15 05:04
关于Android 中 Options.inSampleSize怎么用
最佳答案
这个是读取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就是为了减少内存占用.

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


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);
}


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);
}
}


int roundedSize;
if (initSize <= 8) {
roundedSize = 1;
while (roundedSize < initSize) {
roundedSize <<= 1;
}
} else {
roundedSize = (initSize + 7) / 8 * 8;
}

return roundedSize;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
洁霸洗衣粉好用吗
送给员工,有什么比较好的礼品推荐么?
梦想世界青蛙满攻一个剑气怎么打书
河洞九年制学校地址在哪,我要去那里办事,
一个公司达到什么条件才可以上市?上市后对公
人工湖预算
“苍”繁体字怎么写?
农村房屋坐东向西南方有坟怎么避,大门前六米
bt种子用不用上传源文件
TPE产品表面有亮斑是什么原因造成的,怎么解
给男友的备注
我后面有6只小动物,这一队共有几只小动物
A1绘图纸边框应该画多少阿?
宅旁绿地绿化率是多少
全峰快递(光裕路7)地址在什么地方,我要处理
推荐资讯
本人很胖也很沉默,很自卑,所以不敢和别人交
男龙女兔相配
和对象出去玩,除了电影院和KTV还有什么好玩
蛇鼠一窝和一丘之貉有什么区别
CCNA考试可以带纸和笔进去吗?或是发纸。 还
苦瓜不在大棚里的时候什么时候结果
公路自行车滑齿
0.4x加0.8y等于12求x值,y值
淘宝网上购买的生鲜规定多长时间送达您好!我
海运报价1100/20GP+25 ,是什么意思呢,求
看别人的朋友圈的时候里面显示朋友仅展示近三
中国十大品牌卫浴哪个性价比高?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?