这些年来,网站的图片使用数量和大小都在与日俱增,而HTML、JS和CSS文件大小都相对减小了。也就是说在页面加载的过程中,图片占用了大量的网络流量。所以减小图片的大小可以显著优化页面加载速度。
jpeg/jpg 图片在网站使用中比较常见,可以使用java自带的 java.awt.Image 处理,或者用第三方图片jar(如google的开源工具thumbnailator),今天介绍一个jpeg的处理库MozJPEG。
说起MozJPEG,首先了解一下jpeg的发展历史:
(1)libjpeg:开发时间最早,使用最广泛的 JPEG 库。由于 JPEG 标准过于复杂和模糊,并没有其他人去实现,所以这个库是 JPEG 的事实标准;
(2)libjpeg-turbo:一个致力于提升编解码速度的 JPEG 库。它基于 libjpeg 进行了改造,用 SIMD 指令集 (MMX、SSE2、NEON) 重写了部分代码,官网称相对于 libjpeg 有 2 到 4 倍的性能提升;
(3)MozJPEG: 一个致力于提升压缩比的 JPEG 库。它是 Mozilla 在 2014 年发布的基于 libjpeg-turbo 进行改造的库,相对于 libjpeg 有 5% ~ 15% 的压缩比提升,但相应的其编码速度也慢了很多。
虽然说他的速度慢了一些,但比guetzli快了很多,个人觉得更适合web的图片处理。
话不多言,先对比一下压缩前后的图片。如下图。
压缩前,281 K
压缩后,75k
怎么样,很惊讶吧!色彩和亮度跟原图差不多,也不模糊,感觉称得上无损压缩了,上图是使用了80的压缩质量。压缩质量值可以自己控制。当然了,压缩率设置越低的话,图片也会越模糊。
官方的代码中,有java的测试代码,https://github.com/mozilla/mozjpeg/tree/master/java
java调用mozjpeg,主要是用 JNI
Java
123456789101112131415161718192021222324252627
static void load() { try { System.loadLibrary("turbojpeg"); } catch (UnsatisfiedLinkError e) { String os = System.getProperty("os.name").toLowerCase(); if (os.indexOf("mac") >= 0) { try { System.load("@CMAKE_INSTALL_FULL_LIBDIR@/libturbojpeg.jnilib"); } catch (UnsatisfiedLinkError e2) { System.load("/usr/lib/libturbojpeg.jnilib"); } } else { try { System.load("@CMAKE_INSTALL_FULL_LIBDIR@/libturbojpeg.so"); } catch (UnsatisfiedLinkError e3) { String libdir = "@CMAKE_INSTALL_FULL_LIBDIR@"; if (libdir.equals("@CMAKE_INSTALL_DEFAULT_PREFIX@/lib64")) { System.load("@CMAKE_INSTALL_DEFAULT_PREFIX@/lib32/libturbojpeg.so"); } else if (libdir.equals("@CMAKE_INSTALL_DEFAULT_PREFIX@/lib32")) { System.load("@CMAKE_INSTALL_DEFAULT_PREFIX@/lib64/libturbojpeg.so"); } else { throw e3; } } } }}
来跑一下官方例子:
1. 安装libjpeg-turbo
我是在 mac 笔记本运行的,先安装libjpeg-turbo,可以使用brew。
1
brew install jpeg-turbo
2. 指定库文件路径
比如我的安装目录在/opt/libjpeg-turbo,运行TJExample.java文件时,加上vm参数,指定库文件路径,如下
1
-Djava.library.path=/opt/libjpeg-turbo/lib
也可以在代码上指定库文件路径,不同的操作系统,库文件格式不一样:mac是dylib格式,windows是dll格式,linux是so格式。
1
System.loadLibrary("/opt/libjpeg-turbo/lib/libturbojpeg.dylib");
最后,运行结果如下
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
USAGE: java [Java options] TJExample
以下网站的jpeg图片,就是用了mozjpeg压缩的,可以前往测试效果
demo网站