发表于: 2018-10-12 23:17:16

0 742


一、今天完成的事情

      1. 学习了一些图片压缩方面的知识,因为之前往服务器上传照片时用的都是原图,现在手机的摄像头传感器越来越先进,一张照片动辄就是

5、6Mb大小, 直接上传原图会浪费大量的服务器资源,上传速度也会很慢。

        图片压缩的方法有很多,今天学历需要用到的质量压缩。

       质量压缩的原理是保持像素的前提下改变图片的位深及透明度,(即:通过算法抠掉(同化)了图片中的一些某个些点附近相近的像素),达到降低质量压缩文件大小的目的。

       需要注意的是,质量压缩其实只能实现对file的影响,对加载这个图片出来的bitmap内存是无法节省的,还是那么大。因为bitmap在内存中的大小是按照像素计算的,也就是width*height,对于质量压缩,并不会改变图片的真实的像素(像素大小不会变)。

/**
* 质量压缩
*/
public static void qualityCompress(Bitmap bmp, File file) {
   // 0-100
   int quality = 30;
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   // 把压缩后的数据存放到baos中
   bmp.compress(Bitmap.CompressFormat.JPEG, quality, baos);
   try {
       FileOutputStream fos = new FileOutputStream(file);
       fos.write(baos.toByteArray());
       fos.flush();
       fos.close();
   } catch (Exception e) {
       e.printStackTrace();
   }
}

       核心方法就是.compress(),这个方法有三个参数,第一个是压缩后图片的格式,支持JPEG、PNG、WENBP三种格式;quality这个参数使用来设定压缩后图片的质量的,范围在0-100,设定的值越大,压缩后图片的质量就越好,但体积也会越大,这个可以更具具体要求做取舍;file是文件路径。

       另外,还有一些优秀的开源库,比如luban,可以将图片压缩到很小的体积同时图片的整体质量还能保持得较好。

      

二、明天计划的事情


三、遇到的问题

         今天在使用第三方依赖库时,报错:

          More than one file was found with OS independent path 'META-INF/DEPENDENCIES'

          原因是多个 jar 包里包含了同样的文件(DEPENDENCIES.txt),导致打包时因为担心相互覆盖问题而提示出错,在网上查到的解决办法都是在

build.gradle中加入如下配置项,排除掉中间生成的DEPENDENCIES.txt文件

android {
...
   packagingOptions {
       exclude 'META-INF/*'

   }

...

         但还是会报错:

         Error: Program type already present: org.apache.http.HeaderElementIterator

         原因是多个jar包里包含了同样的HeaderElementIterator.class,文件,于是我把jar包里的HeaderElementIterator.class删了,重新编译,

又是一个新的报错:

        Error: Program type already present: org.apache.http.HttpConnectionMetrics

       原因同上,说明有不止一个类文件重复,删除以后还是继续报错,每次报的类都不一样,而且每次只报一个,总不能一个一个删啊,但是网上有没有查到方法,只好编译一次、删一个,编译一次删一个了,重复了几十次后,终于通过编译了.....不知道有没有简单点的解决办法,或者如何避免这种错误。


四、收获

    学习了图片压缩,但学得比较浅。



返回列表 返回列表
评论

    分享到