说来话长,一切都要从博客建立的那天说起。

由于博客的主机空间、带宽太小,而我又不想使用第三方的图片存储,便只好最大限度地节省主机的空间了。而最占空间的是图片,若是能减小图片所占空间,那么这个小的可怜的主机应该还能撑很长一段时间。最先想到的是谷歌的新图片格式Webp ,体积确实够小,若是Safari也支持便是完美的选择,目前只好搁置一旁。然后是在线图片压缩服务,先后用了TinyPNG 和谷歌的Squoosh ,效果都很好,特别是TingPNG还提供API,虽然每个账号每月只有500张的免费额度。随后了解到,两者都是基于开源的图像压缩工具,那我完全可以用Python写一个脚本调用这些工具。这些工具中最出名的便是Pngquant ,和本文的主角:Mozjpeg

Pngquant 的主页上有编译好的可执行文件,而Mozjpeg则只有源码。谷歌和百度上找遍了都没有他人编译好的.exe 文件。因此只好自己编译了。下面开始编译。

一、准备编译环境

根据Mozjpeg主页上的构建指南,Windows需要安装以下工具:

将以上工具安装完成,将Mozjpeg的源码拉取到本地,便可以进行下一步,Cmake的配置。

二、Cmake的配置

官方指南上的步骤是纯CLI下的,我照着步骤尝试,却总是遇到环境变量的问题。便想着试一下Cmake GUI。

打开Cmake GUI,如下图所示,第一行是指定源码路径,第二行是指定Build文件夹的位置(需要手动在源码目录创建)。

接着点击 Configure,选择MinGW Makefiles,点击Finish。

执行完毕后,手动指定NASM的路径。

最后点击Generate,等待程序执行完毕,Cmake的配置到此结束。

三、编译

终于到了最激动人心的一步。让我们打开命令提示符,进入源码所在目录,输入以下指令:

cmake --build ./Build --config release

点击回车,然后挂起电脑听一首歌,Mozjpeg便编译好了。

然而,编译到31%的时候,编译中断,屏幕抛出一个错误:

提示在jmemmgr.c文件中缺少SIZE MAX 的定义。因此我们打开jmemmgr文件,在其头部加入以下代码:

#if ! defined SIZE_MAX
#define SIZE_MAX (4294967295U)
#endif

意思就是没有定义SIZE_MAX 的时候,定义SIZE_MAX4294967295U

然后清空build文件夹,从头执行编译过程。

编译成功。