如何将图片进行压缩-图片压缩格式+压缩方法
文章目录
- 第三方腾讯数据万象服务
- 本地的图像处理类库WebP
- ✅ 一、前置说明:Java 默认不支持 WebP
- ✅ 二、用 TwelveMonkeys 实现 WebP 压缩(纯 Java)
- 1️⃣ 引入 Maven 依赖
- 2️⃣ 压缩并保存为 WebP 的示例代码
- ✅ 三、压缩参数与文件大小控制
- ✅ 四、如果你想用“本地库 + JNI”方式(最高性能)
- ✅ 五、文件大小验证
- ✅ 六、总结推荐方案
- API方式的图片压缩Webp
- 一、方案目标
- 🧠 二、整体架构设计
- 流程图(统一调用逻辑)
- ⚙️ 三、配置与策略设计
- 1️⃣ 配置文件(config.properties)
- 2️⃣ 模式选择逻辑
- 🧩 四、核心组件设计
- ✅ 接口定义:`ImageCompressor.java`
- ✅ 具体实现:`ConvertApiCompressor.java`
- ✅ 调用入口:`Main.java`
- 🧱 五、项目结构推荐
- 📈 六、方案优缺点分析
- 🔧 七、扩展方向
- ✅ 八、总结(最终方案)
- ConvertAPI
- 一、ConvertAPI 是什么
- ✅ 二、ConvertAPI 支持的图像压缩/转换能力
- 🔄 三、ConvertAPI 确实能同时处理:
- 🧠 四、为什么推荐 ConvertAPI 作为首选方案
- 🔁 五、可替代方案(对比参考)
- 🧩 六、综合建议(企业/个人开发适配)
- 🚀 七、总结一句话方案
不知道有没有同学在完成图片业务时,有没有图片太大而占用较大存储的困扰?
如果有,希望本篇文章能够帮到你
分别从第三方腾讯数据万象服务、本地的图像处理类库WebP、API方式的图片压缩Webp三个方面来全面介绍(起到一个启示引导作用🚀🚀🚀)
首先明确我们对于格式的转换,转为更轻量、更兼容性的webp格式!🚀🚀🚀
WebP:由 Google 开发的现代图片格式,支持有损和无损压缩。相比传统格式:
- 比 PNG 文件小约 26%。
- 比 JPEG 文件小约 25%-34%。
- 支持透明背景(Alpha 通道)。
- 兼容性:大部分主流浏览器(如 Chrome、Edge、Firefox 等)均已支持 WebP。
第三方腾讯数据万象服务
如果图片已经上传到了腾讯云 COS 对象存储服务,可以直接利用数据万象服务。通过配置图片处理规则,在图片上传的同时自动进行压缩处理,减少开发成本。
官方提供了 最佳实践文档 ,主要有 2 种压缩方式:
- 访问图片时实时压缩
- 上传图片时实时压缩,参考文档
- 也可以对已上传的图片进行压缩处理,参考文档。
以上传时压缩为例,要将图片格式转化为 WebP,可以 参考官方文档,在上传文件时,传入 Rules 规则。使用 HTTP API 调用时,传入处理规则参数:
PUT /<ObjectKey> HTTP/1.1
Host: <BucketName-APPID>.cos.<Region>.myqcloud.com
Date: GMT Date
Authorization: Auth String
Pic-Operations:
{"is_pic_info": 1,"rules": [{"fileid": "exampleobject","rule": "imageMogr2/format/<Format>"}]
}
如果使用 SDK,就需要构造图片处理规则对象,参考文档:
// bucket名需包含appid
// api 请参考 https://cloud.tencent.com/document/product/436/54050
String bucketName = "examplebucket-1250000000";String key = "test.jpg";
File localFile = new File("E://test.jpg");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
PicOperations picOperations = new PicOperations();
picOperations.setIsPicInfo(1);
// 添加图片处理规则
List<PicOperations.Rule> ruleList = new LinkedList<>();
PicOperations.Rule rule1 = new PicOperations.Rule();
rule1.setBucket(bucketName);
rule1.setFileId("test-1.jpg");
rule1.setRule("imageMogr2/rotate/90");
ruleList.add(rule1);
PicOperations.Rule rule2 = new PicOperations.Rule();
rule2.setBucket(bucketName);
rule2.setFileId("test-2.jpg");
rule2.setRule("imageMogr2/rotate/180");
ruleList.add(rule2);
picOperations.setRules(ruleList);
putObjectRequest.setPicOperations(picOperations);
try {PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);CIUploadResult ciUploadResult = putObjectResult.getCiUploadResult();System.out.println(putObjectResult.getRequestId());System.out.println(ciUploadResult.getOriginalInfo().getEtag());for(CIObject ciObject:ciUploadResult.getProcessResults().getObjectList()) {System.out.println(ciObject.getLocation());System.out.println(ciObject.getEtag());}
} catch (CosServiceException e) {e.printStackTrace();
} catch (CosClientException e) {e.printStackTrace();
}
本地的图像处理类库WebP
✅ 一、前置说明:Java 默认不支持 WebP
Java 原生(即 javax.imageio)默认不支持 WebP 格式。
所以你必须 引入第三方图像编解码库,例如:
| 库 | 特点 |
|---|---|
| Google libwebp + JNI 封装 | 最底层,性能最高 |
| TwelveMonkeys ImageIO 插件 | 纯 Java 实现,可直接 ImageIO.write() |
| Sejda ImageIO WebP plugin | 基于 libwebp JNI 封装,兼容性好 |
| Xuggler / Image4j 等老库 | 已停止维护,不推荐 |
推荐:TwelveMonkeys ImageIO + WebP 插件
或者若需要极高压缩性能,可以用 libwebp + JNI 方案。
✅ 二、用 TwelveMonkeys 实现 WebP 压缩(纯 Java)
1️⃣ 引入 Maven 依赖
在 pom.xml 中加入以下依赖(假设你使用 Maven):
<dependencies><!-- TwelveMonkeys ImageIO 核心 --><dependency><groupId>com.twelvemonkeys.imageio</groupId><artifactId>imageio-core</artifactId><version>3.10.0</version></dependency><!-- WebP 插件 --><dependency><groupId>com.twelvemonkeys.imageio</groupId><artifactId>imageio-webp</artifactId><version>3.10.0</version></dependency>
</dependencies>
2️⃣ 压缩并保存为 WebP 的示例代码
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;public class WebPCompressor {public static void main(String[] args) throws IOException {File input = new File("input.jpg"); // 输入图片File output = new File("output.webp"); // 输出路径BufferedImage image = ImageIO.read(input);Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("webp");if (!writers.hasNext()) {throw new IllegalStateException("没有找到 WebP Writer,请确认依赖已正确引入");}ImageWriter writer = writers.next();try (ImageOutputStream ios = ImageIO.createImageOutputStream(output)) {writer.setOutput(ios);ImageWriteParam param = writer.getDefaultWriteParam();// 设置压缩参数if (param.canWriteCompressed()) {param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);param.setCompressionQuality(0.8f); // 压缩质量:0.0 ~ 1.0}writer.write(null, new javax.imageio.IIOImage(image, null, null), param);} finally {writer.dispose();}System.out.println("✅ 压缩完成:" + output.getAbsolutePath());}
}
✅ 三、压缩参数与文件大小控制
| 参数 | 含义 | 建议 |
|---|---|---|
compressionQuality | 0.0(最小体积)~ 1.0(最佳画质) | 0.6–0.9 一般效果不错 |
| 图像尺寸缩放 | 若图片非常大,可先缩放后压缩 | 用 BufferedImage.getScaledInstance() 或 Graphics2D 缩放 |
示例(加上缩放):
BufferedImage resized = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
Graphics2D g = resized.createGraphics();
g.drawImage(image, 0, 0, 800, 600, null);
g.dispose();
✅ 四、如果你想用“本地库 + JNI”方式(最高性能)
Google 官方的 libwebp 提供 C/C++ 库。
你可以使用以下 Java 封装:
库名: webp-imageio-core
依赖:
<dependency><groupId>org.sejda.imageio</groupId><artifactId>webp-imageio</artifactId><version>0.1.6</version>
</dependency>
使用方式几乎相同,也是通过 ImageIO.write(image, "webp", output) 完成。
该方案会自动加载本地 .so/.dll 库,性能比纯 Java 实现更好。
✅ 五、文件大小验证
压缩完成后,你可以简单打印文件大小:
System.out.println("压缩后大小:" + (output.length() / 1024) + " KB");
✅ 六、总结推荐方案
| 目标 | 推荐方案 |
|---|---|
| 简单兼容性好 | TwelveMonkeys imageio-webp |
| 极致性能 & 小文件 | Sejda webp-imageio(JNI) |
| 跨平台纯 Java | TwelveMonkeys |
API方式的图片压缩Webp
一、方案目标
在 Java 项目中,实现一个 统一的图片压缩模块,满足以下需求:
| 功能点 | 说明 |
|---|---|
| 输入类型 | 可输入本地文件路径或图片 URL |
| 压缩方式 | 始终调用远程 API(例如 ConvertAPI)完成压缩 |
| 输出格式 | WebP |
| 扩展性 | 后续可增加 JPEG、PNG 等格式压缩接口 |
| 灵活性 | 支持配置使用不同在线 API 服务 |
| 可用性 | 支持批量压缩、错误处理、网络重试等 |
🧠 二、整体架构设计
ImageCompressor(接口层)
│
├── OnlineCompressor(实现类)
│ ├── ConvertApiCompressor
│ ├── CloudinaryCompressor(可选)
│
└── LocalFileHandler(工具类)├── 识别输入是否为URL├── 下载图片临时文件(如必要)
流程图(统一调用逻辑)
┌─────────────────────┐│ 输入(路径或URL) │└──────────┬──────────┘│┌─────────▼─────────┐│ 判断是否为 URL? │└─────────┬─────────┘│┌───────────┴───────────┐│ │✅ URL模式(传Url字段) ✅ 本地模式(上传File)│ │└───────────┬───────────┘│调用在线API(POST)│解析返回JSON│下载WebP文件保存│┌──────────▼──────────┐│ 输出:.webp文件 │└─────────────────────┘
⚙️ 三、配置与策略设计
1️⃣ 配置文件(config.properties)
compressor.api=convertapi
convertapi.secret=YOUR_SECRET
convertapi.quality=80
convertapi.storeFile=true
output.directory=output/
2️⃣ 模式选择逻辑
if (input.startsWith("http")) {// URL 模式body = new FormBody.Builder().add("Url", input).add("WebpQuality", quality).add("StoreFile", "true").build();
} else {// 本地文件模式File file = new File(input);body = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(),RequestBody.create(file, MediaType.parse("image/jpeg"))).addFormDataPart("WebpQuality", quality).addFormDataPart("StoreFile", "true").build();
}
🧩 四、核心组件设计
✅ 接口定义:ImageCompressor.java
public interface ImageCompressor {void compress(String input, String outputPath) throws Exception;
}
✅ 具体实现:ConvertApiCompressor.java
import okhttp3.*;
import java.io.*;public class ConvertApiCompressor implements ImageCompressor {private final String secret;private final String quality;private final OkHttpClient client = new OkHttpClient();public ConvertApiCompressor(String secret, String quality) {this.secret = secret;this.quality = quality;}@Overridepublic void compress(String input, String outputPath) throws Exception {String apiUrl = "https://v2.convertapi.com/convert/jpg/to/webp?Secret=" + secret;RequestBody body;if (input.startsWith("http")) {body = new FormBody.Builder().add("Url", input).add("WebpQuality", quality).add("StoreFile", "true").build();} else {File file = new File(input);body = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(),RequestBody.create(file, MediaType.parse("image/jpeg"))).addFormDataPart("WebpQuality", quality).addFormDataPart("StoreFile", "true").build();}Request request = new Request.Builder().url(apiUrl).post(body).build();try (Response response = client.newCall(request).execute()) {if (!response.isSuccessful())throw new IOException("API请求失败:" + response);String json = response.body().string();String downloadUrl = json.split("\"Url\":\"")[1].split("\"")[0].replace("\\/", "/");System.out.println("✅ 压缩成功,下载URL:" + downloadUrl);// 下载WebP文件Request dlReq = new Request.Builder().url(downloadUrl).build();Response dlRes = client.newCall(dlReq).execute();File outputFile = new File(outputPath);outputFile.getParentFile().mkdirs();try (InputStream in = dlRes.body().byteStream();FileOutputStream out = new FileOutputStream(outputFile)) {in.transferTo(out);}System.out.println("✅ 保存成功:" + outputFile.getAbsolutePath());}}
}
✅ 调用入口:Main.java
public class Main {public static void main(String[] args) throws Exception {ImageCompressor compressor = new ConvertApiCompressor("YOUR_SECRET", "80");// 示例 1:本地文件压缩compressor.compress("C:/images/test.jpg", "output/local_to_webp.webp");// 示例 2:URL 压缩compressor.compress("https://picsum.photos/800/600", "output/url_to_webp.webp");}
}
🧱 五、项目结构推荐
ImageCompressorProject/
│
├── pom.xml
├── config.properties
└── src/└── main/java/com/example/webp/├── ImageCompressor.java├── ConvertApiCompressor.java└── Main.java
📈 六、方案优缺点分析
| 特性 | 优点 | 缺点 |
|---|---|---|
| 在线API统一压缩 | 无需本地图像库,轻量 | 网络延迟依赖外部服务 |
| 同时支持URL和文件 | 灵活、简单 | 需要区分Content-Type |
| 统一接口封装 | 可扩展其他API | 初始配置稍复杂 |
| WebP输出 | 节省体积,兼容主流浏览器 | 较老环境可能不支持 |
🔧 七、扩展方向
| 方向 | 说明 |
|---|---|
| 🧠 自动识别输入格式 | 自动根据文件后缀决定 API 请求路径(jpg/png/gif → webp) |
| ⚙️ 批量压缩 | 输入文件列表或目录自动处理 |
| ☁️ 多平台支持 | 例如支持 TinyPNG、Cloudinary API |
| 🧩 Spring Boot 集成 | 封装为 REST API 服务:POST /compress 上传文件或URL返回WebP |
✅ 八、总结(最终方案)
| 功能 | 状态 |
|---|---|
| ✅ 通过在线 API 压缩 | ✔ 完成 |
| ✅ 支持本地文件输入 | ✔ 完成 |
| ✅ 支持 URL 输入 | ✔ 完成 |
| ✅ 输出 WebP | ✔ 完成 |
| ✅ 可扩展性设计 | ✔ 完成 |
| ✅ 可配置压缩质量 | ✔ 完成 |
ConvertAPI
一、ConvertAPI 是什么
ConvertAPI(https://www.convertapi.com) 是一个国际通用的在线文件格式转换平台,提供:
- 图像、文档、视频、PDF 等格式的在线转换;
- RESTful API(HTTP POST/GET);
- 可免费注册(每日有限额度);
- 支持「本地上传文件」和「传入URL」两种模式;
- 支持输出 WebP、JPG、PNG、PDF 等格式。
✅ 二、ConvertAPI 支持的图像压缩/转换能力
在 ConvertAPI 中,最常见的图像相关接口为:
| 输入格式 | 输出格式 | API Endpoint |
|---|---|---|
| JPG / JPEG | WebP | /convert/jpg/to/webp |
| PNG | WebP | /convert/png/to/webp |
| GIF | WebP | /convert/gif/to/webp |
| 任意格式 | JPG / PNG / WebP | /convert/auto/to/webp |
并且支持参数控制:
| 参数 | 说明 | 示例 |
|---|---|---|
Secret | 你的API密钥 | ?Secret=xxxxx |
WebpQuality | 压缩质量 (1~100) | 80 |
StoreFile | 是否暂存服务器上 | true |
Url | 要压缩的图片URL | https://example.com/img.jpg |
也可以使用 multipart 上传本地图片(字段名 file)。
🔄 三、ConvertAPI 确实能同时处理:
| 场景 | 请求体 | 示例 |
|---|---|---|
| 本地文件上传 | multipart/form-data + file 字段 | 上传本地 test.jpg |
| 远程URL文件 | application/x-www-form-urlencoded + Url 字段 | 提供 https://picsum.photos/800/600 |
两种方式都返回统一的 JSON 响应:
{"Files": [{"FileName": "converted.webp","Url": "https://v2.convertapi.com/d/xxx/converted.webp"}]
}
🧠 四、为什么推荐 ConvertAPI 作为首选方案
| 特性 | ConvertAPI 优势 |
|---|---|
| ✅ 支持多输入模式 | URL、本地文件都支持 |
| ✅ 输出 WebP | 原生支持 WebP 输出 |
| ✅ 简单 REST 调用 | 不需 SDK,HTTP 即可 |
| ✅ 免费额度 | 每天约 150 秒转换配额 |
| ✅ 成熟稳定 | 企业级 SLA 支持 |
| ⚙️ 扩展性强 | 可换 PNG、PDF、DOCX 等接口 |
🔁 五、可替代方案(对比参考)
| 服务 | URL输入 | 本地文件上传 | WebP输出 | 免费额度 | 说明 |
|---|---|---|---|---|---|
| ConvertAPI | ✅ | ✅ | ✅ | ✅ 有限 | 简单、稳定 |
| TinyPNG | ❌ | ✅ | ❌ | ✅ | 仅压缩 JPG/PNG |
| Cloudinary | ✅ | ✅ | ✅ | ✅ | 功能强但需账号配置 |
| ImageKit.io | ✅ | ✅ | ✅ | ✅ | 更偏向 CDN 与图像分发 |
| imgbb / Imgur | ✅ | ✅ | ❌ | ✅ | 主要用于托管,不压缩 |
➡ 结论:
如果你的目标是:
“一份通用 Java 代码,通过 API 压缩图片(无论是本地路径还是 URL),输出 WebP 格式”
那 ✅ ConvertAPI 是目前最简单、最统一、最无侵入的实现方式。
🧩 六、综合建议(企业/个人开发适配)
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| ✅ 个人项目 / Demo | ConvertAPI | 一键接入,无需服务端配置 |
| ✅ 企业项目 / 需长期稳定 | Cloudinary | 有免费层 + 高配扩展性 |
| ✅ 大量批量压缩 | 本地结合 libwebp 或 imgscalr | 避免API速率限制 |
| ✅ Web前端调用 | ImageKit.io / ConvertAPI + CORS | 支持前端调用模式 |
🚀 七、总结一句话方案
✅ 使用 ConvertAPI 统一封装一个
OnlineImageCompressor模块
可自动识别本地文件或URL,通过 REST API 调用 ConvertAPI 完成压缩,并输出 WebP 文件。
