当前位置: 首页 > news >正文

如何将图片进行压缩-图片压缩格式+压缩方法

文章目录

  • 第三方腾讯数据万象服务
  • 本地的图像处理类库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 种压缩方式:

  1. 访问图片时实时压缩
  2. 上传图片时实时压缩,参考文档
  3. 也可以对已上传的图片进行压缩处理,参考文档。

以上传时压缩为例,要将图片格式转化为 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());}
}

✅ 三、压缩参数与文件大小控制

参数含义建议
compressionQuality0.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)
跨平台纯 JavaTwelveMonkeys

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 / JPEGWebP/convert/jpg/to/webp
PNGWebP/convert/png/to/webp
GIFWebP/convert/gif/to/webp
任意格式JPG / PNG / WebP/convert/auto/to/webp

并且支持参数控制:

参数说明示例
Secret你的API密钥?Secret=xxxxx
WebpQuality压缩质量 (1~100)80
StoreFile是否暂存服务器上true
Url要压缩的图片URLhttps://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 是目前最简单、最统一、最无侵入的实现方式


🧩 六、综合建议(企业/个人开发适配)

场景推荐方案理由
✅ 个人项目 / DemoConvertAPI一键接入,无需服务端配置
✅ 企业项目 / 需长期稳定Cloudinary有免费层 + 高配扩展性
✅ 大量批量压缩本地结合 libwebpimgscalr避免API速率限制
✅ Web前端调用ImageKit.io / ConvertAPI + CORS支持前端调用模式

🚀 七、总结一句话方案

✅ 使用 ConvertAPI 统一封装一个 OnlineImageCompressor 模块
可自动识别本地文件或URL,通过 REST API 调用 ConvertAPI 完成压缩,并输出 WebP 文件。

http://www.dtcms.com/a/585951.html

相关文章:

  • 桂林临桂区建设局网站seo建站平台哪家好
  • tornado+gunicorn部署设置max_body_size
  • 大鹏网络网站建设报价asp 建站
  • SSM基于Java的医疗器械销售系统oy281(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • CTFHub Web进阶-PHP:Bypass_disable_function通关9之iconv,bypass iconv1,bypass iconv2
  • 排序算法介绍
  • 服装私人订制网站高端网站建设公司名字
  • CSP-S 练习题:美丽的集合(ST表、二分查找、数论基础-GCD 的应用)
  • 建设一个本地网站网站内容怎么编辑
  • 接口测试基础知识
  • 新网站建设的感想做网站虚拟主机配置
  • LeetCode 419 - 棋盘上的战舰
  • 【视觉】对比分析 GigE Vision、USB3Vision、UCV三种协议
  • 无锡网站制作8揭阳专业做网站公司
  • 建站之星平台怒江网站制作
  • 网站推广技巧汨罗做网站价格
  • Qt-视频播放器
  • 基于单片机的电子琴设计与乐曲存储播放实现
  • 企业站seo哪家好任何人任意做网站销售产品违法吗
  • TensorRT笔记(1):自定义MNIST数据集推理类
  • 基本魔法语言函数(一)(C语言)
  • 西电现代密码学实验三
  • winlogon登录对话框user32!sldrawtext显示星号
  • 昌吉做网站推广的公司php网站后台忘记密码
  • 非法网站开发爱企业 查询
  • 【P1】win10安装 Docker教程
  • 苹果CMS搭建方法技术文章大纲
  • 台州黄岩做网站宁夏众擎达网站建设
  • 电商网站构建网站不支持php
  • 【好书】简史推荐(20251108)