• 有关Option.inSamplSize 和 Compress 图片压缩


    1、图片占用内存:占用的内存 = 图片长度 * 图片宽度 * 单位像素占用的字节数

    注: 图片长度和图片宽度就是图片在行列上的像素数量。

    图片格式:

    ALPHA_8:表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度

    ARGB_4444:表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节

    ARGB_8888:表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节

    RGB_565:表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节

    其中A代表透明度;R代表红色;G代表绿色;B代表蓝色。

     

    2、图片所占的硬盘大小:所占内存基础上进行压缩

      因为图片在内存中时是完全的图片信息,例如即使一个图是全白不透明或全黑全透明也会全部在内存中ffffffff/00000000占用所有的需要的空间。但是在硬盘上却是被压缩的状态,例如平时我们常见的jpg和png,都是将图片信息进行了压缩,然后存储在了硬盘上。所以说一个图片在内存中占用的空间要远大于在硬盘的空间。

    1、png和jpg图片的选择

    png:能用png最好是用png,32位的png颜色过渡平滑且支持透明。

    jpg:是像素化压缩过的图片,质量已经下降了,一般不拿来做.9path的平铺拉伸的控件。

    对于颜色繁杂的,比如照片墙纸,启动页面之类的图片,可用jpg。如果保存成png体积将是jpg的几倍甚至几十倍,严重浪费体积。其他的资源文件使用png。

    2、像素压缩
      抽取图片行和列上的像素点,这会减小图片的尺寸。    
    3、质量压缩
      相邻的像素点,如果ARGB数据比较相近,那么就会统一成相同的像素点数据,如:相邻的像素ARGB为: 00000001 和 00000000 ,在压缩时 两个点都会变成 00000000.

      相同的数据在存进磁盘时就可以不必每一个像素点数据进行存储,可以把一片像素点统一的存一个数据,减小磁盘占用,这会导致图片模糊,就像马赛克

      如:一张长宽很大的图片,若你是纯黑的,你会发现在磁盘的占用非常小。

    注:

     具体显示出来的图片还需要根据具体的屏幕渲染。

     若你图像压缩过的图片,放在一个很大的 ImageView 里同样会模糊

     若你质量压缩过的图片,放在一个很小的 ImageView 里同样不会模糊  

     3、Options.inSampleSize 与 Compress

       1、Options.inSampleSize   减小内存)

        用来从文件或输入流获取bitmap,对源文件存的bitmap使用像素压缩,抽取源图片的一部分像素点来组成一个新的,压缩过的bitmap并返回

      2、Compress()    (减小磁盘存储)

        用来从bitmap保存到输出流,对源bitmap使用质量压缩,对bitmap的各个相邻相近像素点做像素数据统一,再把新的数据放到OutputStream

     1     /**
     2      *      inSampleSize  图片进行压缩
     3      *      若inSampleSize  = n
     4      *      那么图片会得到 原图的  2的n次分之一
     5      *      但 如果 inSmapleSize  = 1 时会得到原始数据
     6      *      如:
     7      *          inSample   压缩
     8      *          1           1
     9      *          2           1/4
    10      *          3           1/8
    11      *          4           1/16
    12      * @param inputStream  输入流
    13      * @param ratio  压缩比
    14      * @return  bitmap
    15      */
    16     public  Bitmap  loadSampleImage(InputStream inputStream,int ratio){
    17         BitmapFactory.Options options = new  BitmapFactory.Options();
    18 //        options.inJustDecodeBounds = true; // 开启只加载图片的大小,不直接加载图片
    19 //        BitmapFactory.decodeStream(inputStream,null,options);//加载图片流的信息到options ,不指定 padding  默认上下左右为0
    20 //        int width  = options.outWidth;
    21 //        int height = options.outHeight;
    22         options.inSampleSize = ratio;
    23         //
    24         options.inJustDecodeBounds  = false;
    25 
    26         Bitmap bitmap = BitmapFactory.decodeStream(inputStream,null,options);
    27         return  bitmap;
    28 
    29     }
    30 
    31     /**
    32      *
    33      *
    34      * @param bitmap
    35      * @param quality  表示 压缩的后的质量 如  0 压缩100%,100意味着不压缩;
    36      * @return  压缩后得到的数据会被存进 OutputStream 可以用于输出到文件
    37      */
    38     public  OutputStream  loadCompressIamge(Bitmap bitmap,int quality){
    39 
    40         ByteArrayOutputStream ops = new ByteArrayOutputStream();
    41         bitmap.compress(Bitmap.CompressFormat.JPEG,50,ops);
    42         return  ops;
    43     }

      

      

     

  • 相关阅读:
    elasticHD
    python3--socketIO_client 摸索怕坑指南
    治疗重新造轮子症系列——递归查询json数据中所有的key值
    REST FRAME WORK--认证 权限 Xadmin
    REST FRAME WORK--视图基类 视图集
    REST FRAME WOEK 请求与响应&视图
    REST FRAME WORK--1
    VUE--axios--对象提供的属性功能
    VUE--组件化开发--VUE-CLI
    Vue中发送ajax请求——axios使用详解
  • 原文地址:https://www.cnblogs.com/the-wang/p/10027480.html
Copyright © 2020-2023  润新知