Android图片无损压缩库ImageCompress使用(最新优化OOM问题的1.0.10版本)

    转载请注明出处:https://blog.csdn.net/hh7181521/article/details/81014839

    图片压缩一直是Android的一个痛点,相比较于iOS的效果,Android的压缩简直可以用惨不忍睹来形容!

    开源库ImageCompress是基于libjpeg-turbo来进行图片的压缩,它的优点在于相较于libjpeg来说压缩时间大大的缩短了(4.5M的图片压缩完耗时约1.2秒),而相较于Android系统的图片压缩来说ImageCompress在图片处理的过程使用了哈弗曼表,这大大的提高了相同体积下图片的清晰度。

一:先来看看效果

    这个是手机拍摄的原图4.28MB。

这里是上一个图片的详细信息

这个是普通压缩后的图片,大小为347KB

而可变图片宽高的压缩方式中,图片最小可压缩到40KB,分辨率为747X1328

二、看过了效果,那么我们来看下怎么使用吧!

   1、 对于Android Studio的用户,可以选择添加:

    compile 'com.wgd.gdcp.gdcplibrary:ImageCompress:1.0.10'
 
implementation 'com.wgd.gdcp.gdcplibrary:ImageCompress:1.0.10'

    如果报错的话可以在项目的build.gradle中加入

    allprojects {
    repositories {
        maven { url "https://dl.bintray.com/wangruijun/maven" }
    }

}

allprojects {
    repositories {
        jcenter() 
    }

}

当然你也可以去GitHub上下载源码https://github.com/WGDrzjz/ImageCompress

2、使用图片压缩

    (1)、直接用lib库压缩,不会调试旋转角度、图片分辨率大小等

        强调:这里runOnUiThread 方法可以不用,但要注意的是:虽然jar包中处理了,但不保证一定是在主线程中回调。
 

// path 为图片地址,savePath是图片要保存的地址

new GDCompress(MainActivity.this, path, savePath, new GDCompressImageListener() {
    @Override
    public void OnSuccess(String path) {
        MainActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                
            }
        });
    }

    @Override
    public void OnError(int code, String errorMsg) {

    }
});

     (2)、单个图片压缩,多线程模式

                 

new GDCompressC(MainActivity.this,
        new GDConfig().setmPath(tempCompressImgPath), new GDCompressImageListener() {
      @Override
      public void OnSuccess(String path) {
          MainActivity.this.runOnUiThread(new Runnable() {
              @Override
              public void run() {
                  
              }
          });
      }

      @Override
      public void OnError(int code, String errorMsg) {

      }
  });

    (3)、单个图片压缩,单线程模式

String tempCompressImgPath = mSelectedPath.get(0);//
GDImageBean imageBeana = new GDImageBean();
imageBeana.setmGDConfig(new GDConfig().setmPath(tempCompressImgPath));
new GDCompressA(MainActivity.this, imageBeana
        , new GDCompressImageListenerA() {
GDCompressImageListener() {
    @Override
    public void OnSuccess(GDImageBean gdImageBean) {
        MainActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                
            }
        });
    }

    @Override
    public void OnError(GDImageBean gdImageBean) {

    }
});

(4)、批量压缩,多线程模式,速度快,但OOM几率大

GDCompressC gdCompressC = new GDCompressC(MainActivity.this, new GDCompressImageListener() {
    @Override
    public void OnSuccess(String path) {
        Log.i(TAG, "OnSuccess: ===批量=====图片压缩=====btn_img_c2========path==" + path);
    }

    @Override
    public void OnError(int code, String errorMsg) {
        Log.i(TAG, "OnError: ===批量=====图片压缩=====btn_img_c2==========");
    }
});
for (int i = 0; i < mSelected.size(); i++) {
    gdCompressC.start(new GDConfig().setmPath(mSelectedPath.get(i)));
}

(5)、批量压缩,单线程模式,速度慢,但OOM几率小很多

GDCompressA gdCompressA = new GDCompressA(MainActivity.this, new GDCompressImageListenerA() {
    @Override
    public void OnSuccess(GDImageBean gdImageBean) {
        Log.i(TAG, "OnSuccess: ===批量=====图片压缩=====btn_img_c3========path==" + gdImageBean.getmGDConfig().getmPath());
    }

    @Override
    public void OnError(GDImageBean gdImageBean) {
        Log.i(TAG, "OnError: ===批量=====图片压缩=====btn_img_c3==========");
    }
});
for (int i = 0; i < mSelected.size(); i++) {
    GDImageBean imageBeana = new GDImageBean();
    imageBeana.setmGDConfig(new GDConfig().setmPath(mSelectedPath.get(i)));
    gdCompressA.start(imageBeana);
}

(6)、多个图片同时压缩(GDConfig中属性下边统一解释)

 

            注:这里OnError方法中返回的数据GDImageBean中通过code字段来判断图片是否成功压缩;而OnSuccess方法中所有的图片都是压缩完成的(即只要有一个图片压缩失败都是回调OnError方法)。

List<GDImageBean> imageBeans = new ArrayList<>();
for (int i = 0; i < selectList.size(); i++) {
    final String imgpath = selectList.get(i).getPath();
    imageBeans.add(new GDImageBean(new GDConfig().setmPath(imgpath)));
}
new GDCompressImageS(SendCircleActivity.this, imageBeans, new GDCompressImageSListener() {    @Override
    public void OnSuccess(List<GDImageBean> imageBeanList) {
        
    }

    @Override
    public void OnError(List<GDImageBean> imageBeanList) {
        
    }
});

   

        (7)、GDConfig中属性统一解释

 

            

new GDConfig()
        .setmPath(tempCompressImgPath)//要压缩图片的原路径
        .setSavePath(tempCompressImgPath)//压缩图片的保存路径,如果不设置将替换原文件
        .setChangeWH(true)//是否要进行调整图片分辨率以压缩到更小
        .setWidth(720)//需要调整分辨率的时候有效,压缩后的宽度(按比例计算后的,而不是直接使用这个)
        .setHeight(1280)//需要调整分辨率的时候有效,压缩后的高度(按比例计算后的,而不是直接使用这个)
 

 

 

 

 

 

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hh7181521

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值