Android Bitmap 全面解析(一) 加载大尺寸图片

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值