一起Talk Android吧(第三百九十四回:使用BitmapFactory.Options缩放Bitmap)

各位看官们,大家好,上一回中咱们说的是"从drawable中获取Bitmap"的例子,这一回中咱们介绍的例子是"使用BitmapFactory.Options缩放Bitmap"。闲话休
提,言归正转,让我们一起Talk Android吧!

我们从源代码中可以看到Options类是BitmapFactory类中的静态类,它提供了一系统的变量来控制Bitmap的属性,我们经常使用它来控制图片的大小,这样可以适配程序中不同的界面,在本章回中我们将详细介绍如何通过Options类来缩放图片。

缩小

我们使用Options的inSampleSize成员变量来缩小图片,它表示采样率,比如它的值为2表示每隔两个样本采样一次,其它的样本就被丢弃了,因此使用它可以缩小图片,而缩小的倍数是1/inSampleSize.这个值最好使用2的n次方,比如2,4,8等,这样可以将图片缩小为原来的1/2,1/4,1/8。这个值使用2的n次方是依据经验得出来的,在官方文档中也没有做详细的说明。

放大

使用Options的inDensityinTargetDensity两个成员变量来放大图片,放大的倍数是inTargetDensity/inDensity。这两个值的取值没有限制,可以是任意的数据,不过也不可以无限地放大,一方面是屏幕无法显示过大的图片,另外一方面是图片过大可能会引起内存泄漏,因为加载图片使用的内存与图片大小有关系。

自动缩放

我们在早期的Android版本(2.2-5.0)上加载图片时经常有OOM发生,大部分都是因为加载了太大的图片引起的,因此我可以依据图片大小和屏幕大小计算缩小的比率,这样可以把太大的图片缩小为与屏幕大小合适的图片,进而减小图片对内存的消耗。下面是依据这个思路与的代码,请大家参考:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;//表示只获取Bitmap的尺寸,而不获取bitmap
//获取bitmap的实际长度和宽度
BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.img1,options);
int originWidth = options.outWidth;
int originHeight = options.outHeight;
//目标图片的长度和宽度,这两个值可以是手机的屏幕大小,或者是显示bitmap的ImageView的大小
int realWidth = 200;
int realHeight = 100;

//默认不进行缩放
int sampleRatio = 1;
float widthRatio = 1.0f;
float heightRatio = 1.0f;

//分别计算宽高的比率,然后从中取最小值,注意分子和分母的位置,采样率最后是取倒数的,因此使用大值/小值的方法
if (originWidth > realWidth | originHeight > realHeight) {
    widthRatio = originWidth / realWidth;
    heightRatio = originHeight / realHeight;

    sampleRatio = (int) Math.min(widthRatio,heightRatio);
}
//通过options来修改采样率,进而缩小图片
options.inSampleSize = sampleRatio;
options.inJustDecodeBounds = false;
//获取缩小后的图片并且将其绑定到ImageView中显示出来
Bitmap mBitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.img1,options);
mImageView.setImageBitmap(mBitmap);

在上面的代码中我们添加了相关的注释,这样有助于大家理解程序的内容,其核心算法就是利用目标尺寸与实际尺寸的比率当作Options的采样率,这样可以实现自动缩放图片的目的。此算法还有一个问题:如果实际尺寸大于图片原始尺寸,那么不对图像进行缩放,也就是采样率为1,此算法主要是为了避免图片过大产生OOM,如果想完美地匹配图片的大小还需要在算法中考虑如何放大图片,大家可以使用放大图像的方法对图像进行放大,我们在这里就不详细展开讨论了。

总结

我们在本章回中介绍了如何缩小和放大图片,并且介绍了如何让图片自动缩放来匹配目标尺寸。依据项目经验来看,普通图标文件的长度或者宽度不会超过200px,正好可以当作Icon,如果想把它当作背景或者其它图像来显示,那么需要放大后才可以被看清楚。正常图片的长度或者宽度都会超过200px,有时候甚至比屏幕的尺寸还要大,比如,相机拍摄的相片,屏幕截图,网络上下载的图片等,这时就需要缩小图片的尺寸,不然可能会因为图片太大引起OOM。

看官们,关于Android中"使用BitmapFactory.Options缩放Bitmap"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值