Android中Bitmap的相关优化压缩及使用
Bitmap不仅为Android的一大方面,也是计算机当中的一大方面,今天这里就介绍一下Android中Bitmap的优化及相关使用
- Bitmap加载方式
- Bitmap的一些方法
- 为什么要高效的加载Bitmap
- 如何高效的加载Bitmap
- BitmapFactory.Options讲解
Bitmap加载方式
BitmapFactory.decodeByteArray(); //字节数组
BitmapFactory.decodeFile(); //文件路径
BitmapFactory.decodeResource(); //资源ID
BitmapFactory.decodeStream(); //流
Bitmap的一些方法
bitmap.extractAlpha(); //可以将它的alpha值单独的生成一张bitmap
bitmap.compress(); //还可以对它进行压缩
bitmap.getByteCount(); //获取它的整个字节数
bitmap.getWidth(); //获取宽度
bitmap.getHeight(); //获取高度
bitmap.createBitmap(); //通过bitmap创建一个bitmap
我们为什么不直接new一个Bitmap而是使用BitmapFactory呢?因为Bitmap可能会非常占用内存,所以系统帮我们创建了这个BitmapFactory工程类,然后我们就可以通过这个工程类创建不同的bitmap,而且Bitmap的构造方法也是私有的不允许我们直接new
为什么要高效的加载Bitmap
1.防止内存溢出
2.尽可能的节省内存开销
3.使我们的应用跑的更加流畅
如何高效的加载Bitmap
理论依据:BitmapFactory.Options这个类为我们的高效加载提供了可能性
BitmapFactory.Options讲解
这个Options其实是BitmapFactory里的一个内部类,它有以下几个重要的属性:
1.inJustDecodeBounds
2.outWidth&outHeight
3.inSampleSizeinJustDecodeBounds它是布尔型变量,如果标为true,我们在BitmapFactory.decode的时候它并不会真正的返回一个Bitmap(标为true它只会加载图片的宽和高,并不会加载图片的真正内容所以就不会占用那么大的内存),而是只会返回bitmap的width和height而且把它的width和height储存到Options的outWidth和outHeight中,它第三个重要的inSampleSize中是一个采样率,通过这个采样率我们可以极大的降低减少内存上的占有
在BitmapFactory.Options中它还有很多其他的字段值,上面3个是我们最常用的,通过这三个我们就可以在Bitmap加载中进行极大的优化
说时迟那时快,那么下面我们通过代码实战操作一下
public class BitmapUtil {
public static Bitmap ratio(String filePath, int pixelW, int pixelH) {
BitmapFactory.Options newOptions = new BitmapFactory.Options();
newOptions.inJustDecodeBounds = true;
//位深度,如果图片不是特别大而肉眼又看不出来的话可设置低一点的位深度
//默认8888是最高的位深度(图片质量最好的,每一位像素都要占用8个字节)
newOptions.inPreferredConfig = Bitmap.Config.RGB_565;
//预加载
BitmapFactory.decodeFile(filePath, newOptions);
//预加载以后我们就可以获取到图片的宽和高
int originalW = newOptions.outWidth;
int originalH = newOptions.outHeight;
//取出宽高后就可以对它进行采样
newOptions.inSampleSize = getSimpleSize(originalW, originalH, pixelW, pixelH);
//这里要将它设为false(不再去只加载它的宽高)
newOptions.inJustDecodeBounds = false;
//获取了采样值以后就可以真正的对它进行加载
return BitmapFactory.decodeFile(filePath, newOptions);
}
/**
* 原始的宽高 要显示的宽高
*/
private static int getSimpleSize(int originalW, int originalH, int pixelW, int pixelH) {
int simpleSize = 1;//默认采样为1(不压缩)
if (originalW > originalH && originalW > pixelW) {
simpleSize = originalW / pixelW;//以宽度进行采样计算
} else if (originalW < originalH && originalH > pixelH) {
simpleSize = originalH / pixelH;//以高度进行采样计算
}
if (simpleSize <= 0) {
simpleSize = 1;
}
return simpleSize;
}
}
运行结果:可以看到压缩前后是没有什么区别的
再看看Bitmap所占用的内存
整整少了一半,可见Bitmap内存优化还是很有用处的
如果觉得图片占用还是太大继续调整上面代码中的设置就好了,注释写的明明白白,多动手去做