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

Posted talk_8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起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"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

以上是关于一起Talk Android吧(第三百九十四回:使用BitmapFactory.Options缩放Bitmap)的主要内容,如果未能解决你的问题,请参考以下文章

一起Talk Android吧(第二百九十四回:Android中的BLE开发:注册特征值通知三)

一起Talk Android吧(第三百九十二回:适配全屏幕-splash)

一起Talk Android吧(第三百九十回:关于Android版本12适配蓝牙权限的问题)

一起Talk Android吧(第三百九十回:关于Android版本12适配蓝牙权限的问题)

一起Talk Android吧(第三百九十九回:获取Bitmap的方法总结)

一起Talk Android吧(第三百九十一回:修改BottomNavigationView中的图标和文字颜色)