在网络平台写作经常需要上传一些gif动图,有些gif动图太大的情况下,不仅加载慢还影响文章阅读体验。为了方便压缩录制的GIF动图,说干就干,自己开发一个GIF图像压缩工具。本文将介绍手把手教你基于 imagemin-gifsicle 库开发一款压缩GIF图像的web在线工具。
一、压缩原理
imagemin-gifsicle 库是一个基于 gifsicle 库的插件,用于压缩GIF图像。 gifsicle 是一种用于处理GIF图像的命令行工具,它可以从命令行中运行,并使用各种压缩算法来减小文件大小。imagemin-gifsicle 库使用了 gifsicle 库的一些算法来压缩GIF图像。它可以通过多种方式来减小文件大小。gifsicle 库的算法实现思路包括以下几个步骤:
-
首先,
gifsicle库会将GIF图像加载到内存中,然后将其拆分为多个帧。每个帧都包含一个图像和一个延迟时间,用于控制帧的播放速度。 -
接下来,
gifsicle库会对每个帧进行优化。这个过程包括以下几个步骤:- 优化颜色表:
gifsicle库会分析图像中的像素,并使用最少的颜色数来表示它们。这可以减小文件大小,并提高图像的质量。 - 删除不必要的数据块:
gifsicle库会删除注释和应用程序扩展块等不必要的数据块,从而减小文件大小。 - 帧优化:
gifsicle库会对每个帧进行优化,以减小其大小。这可能包括删除重复的像素、压缩像素和调整颜色表等操作。 - 帧删除:
gifsicle库会删除重复的帧,从而减小文件大小。
- 优化颜色表:
-
最后,
gifsicle库会将优化后的帧重新组合成一个新的GIF图像,并将其写入磁盘。这个新的GIF图像将比原始图像更小,并且质量更高。
以上是 gifsicle 库的算法实现思路,对于想要深入了解GIF图像压缩的同学,可以参考 gifsicle 库的源代码,进一步学习其实现原理。
二、运行效果
三、 实现步骤
工具的实现是从搭建一个简单的网站的方式来实现,当然大家也可以把这个写成一个脚本运行,实现方式很灵活,改动也很小。
1. 初始化项目
首先需要对我们的项目进行初始化。先创建一个空的文件夹并将其命名为项目名称,然后在终端中进入该文件夹。运行 npm init 的命令,填写项目的相关信息,如项目名称、版本号、描述等。这里我就为了快速,直接npm init -y 跳过了前面填写项目信息的步骤。
npm init -y
将创建一个默认的 package.json 文件,其中包含我们的项目信息和依赖项。
2. 安装依赖
接着我们需要安装一些依赖项。我们可以使用 npm 或者cnpm来安装这些依赖项,大家可以安装nrm ,这可以让大家快捷切换node包下载的镜像源,超级方便。
# (推荐)安装nrm到全局
npm install nrm -g
# 安装各个模块,以下方法二选一
npm install express multer imagemin@7.0.1 imagemin-gifsicle
# or
cnpm install express multer imagemin@7.0.1 imagemin-gifsicle
我们需要安装以下依赖项:
express:用于创建Web服务器,大家也可以用koa更轻量级。multer:用于处理文件上传。imagemin-gifsicle:用于压缩GIF图像。imagemin:用于压缩各种类型的图像,包括GIF、JPEG、PNG等格式。
注意: 这里在安装imagemin的时候会有一个坑,最新版本的imagemin是ES模块,而我们需要在commonJS规范中使用,这时当运行项目的时候就会报一个
"ERR_REQUIRE_ESM"的错误,解决这个错误的方法就是指定一个支持commonJS规范的版本,这个项目中我是用了imagemin@7.0.1的版本,问题就解决了。
3. 创建服务器
因为是web在线的工具,所以需要搭建一个服务器来运行。使用 express 框架来创建一个简单的服务器。在项目根目录下创建一个名为 app.js 的文件,然后创建一个public文件夹,并将 public 文件夹设置为静态文件目录。在 public 文件夹中可以放置任何静态文件(如HTML、CSS、JS文件),启动服务器监听端口3000。在app.js 中添加下面代码:
const express = require('express');
const app = express();
app.use(express.static('public'));
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
4. 创建前端页面
接着继续创建一个前端页面,使用户能够上传GIF图像并压缩它们。这里的页面写的很简单,没有任何样式,大家有兴趣的可以自行添加丰富的样式和完善交互体验。在 public 文件夹中创建一个HTML文件。
<h1>GIF图像压缩工具</h1>
<form action="/compress" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">上传并压缩</button>
</form>
5. 创建压缩功能
在服务器端使用 imagemin-gifsicle 库来实现GIF图像的压缩。通过 multer 中间件将上传的GIF图像存储到 public/uploads 文件夹中。然后,利用 imagemin 库将GIF图像压缩到public/compressed 文件夹中。压缩完图片后,调用 res.download() 方法将压缩后的GIF图像发送给前端页面进行下载。在 app.js 文件中添加以下代码:
const multer = require('multer');
const imagemin = require('imagemin');
const gifsicle = require('imagemin-gifsicle');
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'public/uploads')
},
filename: function (req, file, cb) {
cb(null, file.originalname)
}
});
const upload = multer({ storage: storage });
app.post('/compress', upload.single('file'), async (req, res) => {
const files = await imagemin([`public/uploads/${req.file.filename}`], {
destination: 'public/compressed',
plugins: [gifsicle({optimizationLevel:3,colors:180})]
});
res.download(files[0].destinationPath);
});
6. 运行项目
到这里,基本就把这个工具开发完了,虽然简陋,但是核心功能实现了,接着就是把应用启动起来,执行下面的命令运行项目代码:
node app.js
web在线工具将在 http://localhost:3000 上运行,打开浏览器访问该地址,便可使用压缩功能了。
四、写在文末
通过本文,相信大家学会了如何使用 imagemin-gifsicle 库开发一个GIF图像压缩工具。我们了解了 imagemin 库的使用方法和 gifsicle 库的压缩算法,以及如何将这些工具集成到我们的Web应用程序中。虽然这个工具比较简陋,但是它为我们提供了一个压缩GIF图像的简单方法,让我们的文章阅读体验更加流畅。希望这个例子对大家有所帮助,感谢大家的阅读!