zoukankan      html  css  js  c++  java
  • Android中的图片压缩

    1、android中计算图片占用堆内存的kB大小跟图片本身的kB大小无关,而是根据图片的尺寸来计算的。

          比如一张 480*320大小的图片占用的堆内存大小为:

          480*320*4/1024=600kB  之所以要乘以4,是因为在android中使用的ARGB图片,图片一个像素占用四个字节。

    2、手机出厂时 堆内存(Heap)是固定的,所以为了不造成OOM,我们就需要生成bitmap时对图片进行压缩处理。

             实际使用中我们压缩图片的标准是手机屏幕大小作为参照的,这个主要是因为,即便是图片尺寸跟屏幕尺寸相同,换算出来所占的内存大小也要远小于手机堆存。

             为了讲解方便,我们就以 480*320大小的手机为例,图片压缩为同手机屏幕同尺寸时,所占的大小为 600kb,也就是0.6M,而480*320的手机的出厂heap一般是16M,这个数字根据每个厂商有所差异。

    3、压缩方式:通过bitmap的options

           首先大家要知道,当图片太大造成加载时,报OOM异常是在哪个地方报的?

           打印测试知道是在:Bitmap bitmap =  BitmapFactory.decodeFile(url)这行就报错。所以我们的处理如下:

            

    /**
         * 压缩图片
         *
         * @param photoPath
         */
        public static Bitmap compressImage(Activity act, String photoPath) {
            int screenWidth = act.getWindowManager().getDefaultDisplay().getWidth();
            int screenHeight = act.getWindowManager().getDefaultDisplay().getHeight();
            LogUtils.logInfoStar("screenWidth为" + screenWidth + "------screenHeight" + screenHeight);
            BitmapFactory.Options opts = new BitmapFactory.Options();
            opts.inJustDecodeBounds = true;//设置为true的目的,拿到图片的一些附属信息
            BitmapFactory.decodeFile(photoPath, opts);
            int imgWidth = opts.outWidth;
            int imgHeight = opts.outHeight;
    //获取屏幕尺寸的方式二:支持13以上版本,就是使用point存储宽高,然后再取出来。  
    // Point point=new Point();
    // getWindowManager().getDefaultDisplay().getSize(point);
    // screenWidth=point.x; 8 // screenHeight=point.y;
    LogUtils.logInfoStar(
    "图片原大小" + "imgWidth为:" + imgWidth + "imgHeight" + imgHeight); //按屏幕大小获取的压缩比例,加入判断,只有图片尺寸大于屏幕尺寸时才压缩 if (imgHeight > screenHeight || imgWidth > screenWidth) { int sizeByScreenSize = imgWidth / screenWidth > imgHeight / screenHeight ? imgWidth / screenWidth : imgHeight / screenHeight; //再在此基础把压缩比例增大10倍 opts.inSampleSize = sizeByScreenSize * 10; LogUtils.logInfoStar("inSampleSize" + sizeByScreenSize); } else { opts.inSampleSize = 1; } opts.inJustDecodeBounds = false; Bitmap mImage = BitmapFactory.decodeFile(photoPath, opts); return mImage; }

     总结:

         

    ##缩放加载大图片
    1.获取你想显示的图片应该有的大小,如果是全屏,就获取屏幕大小

    2.获取图片的原始大小,不将图片真正加载到内存,只拿到图片的附属信息
    Options opts = new Options();
    设置为true,不加在内存,只拿信息
    opts.inJustDecodeBounds = true;
    3.对图片做压缩处理,压缩的前提是图片的大小大于你要显示的区域大小
    按照宽或者高的比例进行计算,选择比例大的那个进行压缩
    压缩的比例值最后复制给
    opts.inSampleSize = scale;
    4.比例设置完之后,这时候才是真正的去加载图片到内存当中
    opts.inJustDecodeBounds = false;
    5.最后一部才是加载图片
    Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg", opts);

    我们做这么多操作的最终目的其实就是为了要opts.inSampleSize = scale这个值。

  • 相关阅读:
    php 实现简单加入购物车(1)
    php添加购物车
    php注册审核
    session与cookie的区别和用法
    淘宝搜索算法现状
    垃圾回收原来是这么回事
    编程思想之——"人是活的,程序是死的"
    路飞项目搭建3 TODO注释, 自定义模态框, vue-cookies操作浏览器cookies, 腾讯云短信开发, 代码(登录注册页面,多方式登录,手机是否存在验证接口,腾讯短信开发)
    git 码云
    路飞项目搭建2 luffy前台主页, xadmin后台管理, 前后台分离跨域交互, 自定义配置, 浏览器屏幕缩放bug修复
  • 原文地址:https://www.cnblogs.com/epmouse/p/5352945.html
Copyright © 2011-2022 走看看