Android中Bitmap的相关优化压缩及使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014093134/article/details/79551365

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.inSampleSize

inJustDecodeBounds它是布尔型变量,如果标为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内存优化还是很有用处的

如果觉得图片占用还是太大继续调整上面代码中的设置就好了,注释写的明明白白,多动手去做
点击Demo下载源码 密码: 2m8d


第一次写博客,不明白或不对的地方可以提出

感谢支持

感谢慕课网带来的教学

猜你喜欢

转载自blog.csdn.net/u014093134/article/details/79551365