# java-png-compress-util
**Repository Path**: dvd110/java-png-compress-util
## Basic Information
- **Project Name**: java-png-compress-util
- **Description**: 🔨Java实现的 Png 图片压缩工具,底层使用pngquant,仅支持png格式的压缩,压缩率在50%~70%左右
- **Primary Language**: Unknown
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 4
- **Created**: 2024-02-19
- **Last Updated**: 2024-02-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 🔨Java实现的 Png 图片压缩工具
本项目底层使用 [libimagequant](https://pngquant.org/lib/) 依赖库,使用java JNI调用实现对PNG图片进行压缩,压缩效果和目前在线的 TinyPNG 可以媲美,压缩率比例可以自己参数控制,默认参数可以使PNG格式图片压缩50%~70%左右,本项目已经打包好了windows、mac以及linux所需的依赖包。
### 项目结构
```shell
—>java-png-compress-util
├─src
│ ├─main
│ │ ├─java
│ │ │ ├─com
│ │ │ │ └─biejieshi
│ │ │ │ └─compress #工具类
│ │ │ └─org
│ │ │ └─pngquant #JNI方法
│ │ └─resources
│ │ └─libimagequant #libimagequant打包依赖
│ └─test
│ ├─java
│ │ └─com
│ │ └─biejieshi
│ │ └─compress #测试用例
│ └─resources #测试用例图片位置
└─
```
### 压缩效果
| 测试用例文件名 | 原文件大小 | 压缩后文件大小 | 压缩率 |
| -------------- | ---------- | -------------- | ---------- |
| test-1.png | 534.7 Kb | 227.02 Kb | **57.5 %** |
| test-2.png | 103.61 Kb | 38.22 Kb | **63.1 %** |
| test-3.png | 78.69 Kb | 35.45 Kb | **54.9 %** |
| test-4.png | 2.77 Mb | 1.08 Mb | **62.1 %** |
### 使用步骤
- 克隆本项目打包并引入依赖
```xml
com.biejieshi.compress
java-png-compress-util
1.0.0
```
- 使用压缩方法
```java
/**
* 测试Png压缩
* 方法:PngCompressUtils.compressPng(BufferedImage bufferedImage)
*/
@Test
public void testPngCompress() {
String testFileName = "test-1.png";
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(testFileName);
try {
ImageIO.write(PngCompressUtils.compressPng(ImageIO.read(inputStream)), "png",
new FileOutputStream(testFileName.replace(".png", "") + "-compress-result.png"));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("compress complete!");
}
```
### libimagequant 编译步骤
- 下载源码包
下载地址:https://github.com/ImageOptim/libimagequant
源码是C编写的,java需要通过JNI(java native interface)来调用,不了解JNI的同学可自行百度,简单来讲,JNI就是java像调用本地方法一样调用用C写的代码。
- 编译
Linux下安装java环境, 执行 `make java`
Windows环境下安装MinGW-w64,执行 `make java-dll`
**注意:** mac使用".jnilib"文件,windows使用".dll" 文件,linux使用".so"文件(本项目resources/libimagequant下提供了已经编译好的最新版本,可直接使用)