Android Bitmap 全面解析(一) 加载大尺寸图片
2014-12-30
androidHu...
文章来源 阅 363 转 2
其他参数自行研究,这里暂时只用到这几个 decodeSampledBitmapFromResource方法内的三段代码对应上面的三步流程 难点在于中间那步,压缩比例的计算,官网同样提供了个calculateInSampleSize方法 其中reqWidth和reqHeight是所需图片限定最小宽高值
/**
* 计算压缩比例值
*
@param
options 解析图片的配置信息
*
@param
reqWidth 所需图片压缩尺寸最小宽度
*
@param
reqHeight 所需图片压缩尺寸最小高度
*
@return
*/
public
static
int
calculateInSampleSize(BitmapFactory.Options options,
int
reqWidth,
int
reqHeight) {
// 保存图片原宽高值
final
int
height = options.
outHeight
;
final
int
width = options.
outWidth
;
// 初始化压缩比例为1
int
inSampleSize = 1;
// 当图片宽高值任何一个大于所需压缩图片宽高值时,进入循环计算系统
if
(height > reqHeight || width > reqWidth) {
final
int
halfHeight = height / 2;
final
int
halfWidth = width / 2;
// 压缩比例值每次循环两倍增加,
// 直到原图宽高值的一半除以压缩值后都~大于所需宽高值为止
while
((halfHeight / inSampleSize) >= reqHeight
&& (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return
inSampleSize;
}
利用此方法获取到所需压缩比例值,最终获取到压缩后的图片~
以上代码能够看懂的话,下面这段/*扯淡*/可以跳过
/*
逻辑是将原图宽高一半一半的缩减,一直减到宽高都小于自己设定的限定宽高时为止,测试的时候问题来了
原图400*300,我限定值200*150,if满足进入,while循环第一次,400/2/1=200不满足>的条件~结束循环,
最终返回了个inSampleSize=1给我
马丹我限定值正好是原图的一半啊,你应该返回给我2啊~你特么最后返回个1给我,那压缩处理后的图还是400*300!!!
当我将限定值稍微改一下变成195*145稍微降低一点点时~if满足进入,while循环第一次,400/2/1>195满足~
然后压缩比例1*2变成了2,在下一次while循环时不满足条件结束,最后返回比例值2~ 满足压缩预期
大于~不是大于等于,所以就会出现我上面那种情况,我觉得方法不是太好= = 能满足压缩的需求,但是压缩的比例不够准确~ 所以最好改成大于等于,如下(个人意见,仅供参考,在实际压缩中很少遇到恰巧等于的这个情况,所以>和>=差别也不大额~看我这扯扯淡就当对计算比例的逻辑加深个理解吧)
while ((halfHeight / inSampleSize) >= reqHeight
&& (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
|