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

article/2025/10/11 12:15:13

    转载请注明出处: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() {@Overridepublic void OnSuccess(String path) {MainActivity.this.runOnUiThread(new Runnable() {@Overridepublic void run() {}});}@Overridepublic void OnError(int code, String errorMsg) {}
});

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

                 

new GDCompressC(MainActivity.this,new GDConfig().setmPath(tempCompressImgPath), new GDCompressImageListener() {@Overridepublic void OnSuccess(String path) {MainActivity.this.runOnUiThread(new Runnable() {@Overridepublic void run() {}});}@Overridepublic 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() {@Overridepublic void OnSuccess(GDImageBean gdImageBean) {MainActivity.this.runOnUiThread(new Runnable() {@Overridepublic void run() {}});}@Overridepublic void OnError(GDImageBean gdImageBean) {}
});

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

GDCompressC gdCompressC = new GDCompressC(MainActivity.this, new GDCompressImageListener() {@Overridepublic void OnSuccess(String path) {Log.i(TAG, "OnSuccess: ===批量=====图片压缩=====btn_img_c2========path==" + path);}@Overridepublic 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() {@Overridepublic void OnSuccess(GDImageBean gdImageBean) {Log.i(TAG, "OnSuccess: ===批量=====图片压缩=====btn_img_c3========path==" + gdImageBean.getmGDConfig().getmPath());}@Overridepublic 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() {    @Overridepublic void OnSuccess(List<GDImageBean> imageBeanList) {}@Overridepublic void OnError(List<GDImageBean> imageBeanList) {}
});

   

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

 

            

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

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/fjOr4u74.shtml

相关文章

无损压缩技术

一个视频经过有损压缩完成后&#xff0c;会再进行无损压缩&#xff0c;让视频进一步变小。 DCT 变化 DCT 变化的过程又叫量化&#xff0c;经过有损压缩后&#xff0c;数据分散在二维图标中的各个节点上&#xff0c;经过 DCT 变化&#xff0c;会将所有数据集中到某一块。 转换…

使用Tuimgs在线工具对图片无损压缩教程

正文: 图片体积压缩是很多设计师都不陌生的事情&#xff0c;在多数情况下&#xff0c;即使你并不是一位设计师&#xff0c;但是你也可能需要使用到图片压缩&#xff0c;就例如:我们需要存储一张图片到手机的时候&#xff0c;但是这张图片的体积实在是太大了&#xff0c;会占用…

图片无损压缩工具(报名照片压缩至30Kb以下

% 我姐报名的需求 &#xff08;文中图片都是直接拖入博客编辑器的&#xff09; 素材选用&#xff1a;邓紫棋照片一张 【排雷】吐槽一下知乎高赞答案提供的方法&#xff1a;右键编辑&#xff0c;重新设置大小 198赞&#xff0c;评论一堆尬吹 用此方法将上图压缩至27.7KB结果如…

图片无损压缩软件哪个好用:试试完全免费的JPG-C 图片批量修整压缩减肥工具吧 | 最新jpg批量修整工具下载

JPG-C是一款完全免费且非常实用的电脑批量图片无损压缩软件&#xff0c;基于Net开发&#xff0c;也叫jpg批量修整工具&#xff0c;第一个版本始于2013年4月份&#xff0c;区区几百KB的超迷你身材但是能力确不容小觑&#xff0c;用户可以根据自定的压缩级别以单个或批量的方式对…

win7查询计算机硬盘sn,电脑win7系统查询硬盘序列号的方法

近些年来,科学技术的迅猛发展,极大地推动了计算机网络技术的进步,计算机网络的日益发展,使人们的生活也发生着巨大的变化。下面是学习啦小编为大家整理的关于电脑win7系统查询硬盘序列号的方法&#xff0c;一起来看看吧! 电脑win7系统查询硬盘序列号的方法 方法一&#xff1a;我…

win7/win10下装centos7双系统

工具及材料 1、一台PC 2、一个U盘,8G以上 3、需要的文件:CentOS-7-x86_64-DVD-1511.iso(其他版本也可以如 1611) 4、需要的软件:USBwriter(优于UltraISO) 第一步:从windows硬盘分区中再划一个用于装centos的分区 我的电脑->右键->管理,然后 到这里…

计算机系统盘涨满怎么办,win7系统C盘突然就满了怎么办?win7系统盘突然爆满了三种解决方法图文教程...

最近,有win7系统用户反映,电脑的系统盘突然就爆满了,这该怎么办呢?大家可以释放C盘空间,下面脚本之家的小编和大家讲解win7系统盘突然就满了三种解决方法,一起来看看吧。 win7系统盘突然就满了解决方法一:移走虚拟内存文件到非系统盘 大家都知道,为了加快系统的运行,W…

win7修复计算机 正常启动不了怎么办,Win7系统无法正常启动怎么办

Win7系统开机自检之后&#xff0c;始终无法进入系统&#xff0c;重启也无法解决。不要紧&#xff0c;下面是学习啦小编给大家整理的一些有关Win7系统无法正常启动的解决方法&#xff0c;希望对大家有帮助! Win7系统无法正常启动的解决方法一 1.我们可以开机F8进入系统高级选项菜…

Win7系统文件缺失怎么修复

Win7系统文件缺失怎么修复&#xff1f;有些朋友的电脑经常会提示缺失某些文件&#xff0c;比较严重的连系统桌面都进不去&#xff0c;大家想要了解有什么方法可以修复系统文件缺失的问题。今天俺就给大家分享几个恢复系统文件的方法。 一、进入安全模式 在重启或者电脑开机的时…

关于Win7系统“U盘拒绝访问”解决问题

问题场景&#xff1a; 提示&#xff1a;U盘无损坏&#xff0c;不能显示容量&#xff0c;并且提示拒绝访问 在属性中有很明显的不能够更改操作组和用户组的权限&#xff0c;无法添加用户权限名称 解决方案&#xff1a; 1、在系统桌面上&#xff0c;按组合键&#xff08;win键…

服务器虚拟机怎么安装win7系统教程,虚拟机怎么安装win7系统 虚拟机安装win7系统教程...

有的时候我们会想要通过虚拟机来进行安装win7系统&#xff0c;但如果不会安装该怎么办呢?这个问题好解决&#xff0c;不是大事&#xff0c;你们就继续往下看&#xff0c;看看虚拟机怎么安装win7系统的吧。 虚拟机安装win7系统教程方法 1.打开运行虚拟机&#xff0c;然后点击界…

用u盘给服务器装win7系统,用U盘装系统装Win7图文教程

win7之家小编认为用U盘装系统装Win7是一个非常好用的方法,那么我们到底要如何利用u盘装win7系统呢?其实方法非常简单,下面小编就来教大家u盘装win7系统,一起来看看下面这篇用U盘装系统装Win7图文教程吧,保证不会让大家失望的哦。 工具/原料: U盘一个 方法/步骤: 首先我们…

电脑W7系统怎样安装鸿蒙系统,真正纯净版的win7系统

真正纯净版的win7系统很多的小伙伴都非常的想要下载,很想试试这个版本的win7吧,win是目前兼容性比较高的一个系统,也是很多用户选择的一个版本,喜欢的用户赶紧下载试试吧。 真正纯净版的win7系统特色 人性化的设计师资源保证所有的非系统都保存在磁盘上,不会再次丢失。 系…

联想微型计算机能装光盘,联想光盘装系统win7安装方法

随着正版Windows7用户的不断增加&#xff0c;许多用户开始尝试自己对重新安装或是帮朋友安装Windows7的系统。但是Windows 7的安装过程&#xff0c;可能会因为许多外在原因导致安装不能够继续进行。 有朋友想要自己安装win7操作系统&#xff0c;这里简单的整理下方便需要的朋友…

win7查看计算机硬盘序列号,win7系统通过cmd查看硬盘序列号的操作方法

很多小伙伴都遇到过对win7系统通过cmd查看硬盘序列号进行设置的困惑吧&#xff0c;一些朋友看过网上对win7系统通过cmd查看硬盘序列号设置的零散处理方法&#xff0c;并没有完完全全明白win7系统通过cmd查看硬盘序列号是如何设置的&#xff0c;今天小编准备了简单的操作办法&am…

戴尔服务器改win7系统教程,新款戴尔win10改win7系统教程

现在市面上大部分戴尔dell电脑都预装了win10系统&#xff0c;但是有些用户可能用不习惯&#xff0c;就想要将其改为win7系统&#xff0c;却不知道要怎么操作&#xff0c;那么戴尔dell预装win10怎么改win7系统呢&#xff1f;下面给大家讲解一下具体的操作步骤吧。 1、开机&#…

win7计算机系统减肥,Win7系统如何减少C盘空间,给系统盘瘦身

当系统使用久了就会发现&#xff0c;C盘(系统盘)在不断地变大&#xff0c;有些用户的系统盘甚至出现了红色的条条&#xff0c;提示即将爆满。C盘可用空间过少&#xff0c;在一定程度上会影响系统的运行速度&#xff0c;当然若系统盘内存变无时&#xff0c;还会导致系统无法开机…

新计算机如何用光盘安装系统,win7如何用光盘装系统_使用光盘重装win7系统步骤...

当电脑遇到一些问题导致无法使用的时候&#xff0c;很多用户都喜欢重装系统&#xff0c;那么最简单的就是使用光盘或者U盘来安装&#xff0c;许多用户可能还不知道win7如何用光盘装系统&#xff0c;为了帮助到大家&#xff0c;小编给大家演示一下使用光盘重装win7系统步骤。 一…

win7如何调整计算机c盘,Win7系统增加C盘空间的方法

电脑使用久了C盘就很容易出现空间不足&#xff0c;这时候我们就需要对C盘进行增加空间&#xff0c;可是很多用户不知道怎么增加C盘空间&#xff0c;其实方法很简单&#xff0c;如果你不懂的话&#xff0c;那么赶紧看看小编整理的Win7系统增加C盘空间的方法吧&#xff01; 方法/…

如何使用光盘启动计算机,怎么用光盘PE安装win7系统

PE全称Windows Preinstallation Environment(中文翻译为windows预安装环境)&#xff0c;Windows PE运行的服务非常的少&#xff0c;基本上只是满足了windows运行的基本服务&#xff0c;本文介绍怎么用PE安装win7系统。 前期准备&#xff1a; 需要有PE的u盘启动盘或者带有PE的光…