这些年来,网站的图片使用数量和大小都在与日俱增,而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的图片处理。
话不多言,先对比一下压缩前后的图片。如下图。
怎么样,很惊讶吧!色彩和亮度跟原图差不多,也不模糊,感觉称得上无损压缩了,上图是使用了80的压缩质量。压缩质量值可以自己控制。当然了,压缩率设置越低的话,图片也会越模糊。
官方的代码中,有java的测试代码,https://github.com/mozilla/mozjpeg/tree/master/java
java调用mozjpeg,主要是用 JNI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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"); |
最后,运行结果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
USAGE: java [Java options] TJExample <Input image> <Output image> [options] Input and output images can be in any image format that the Java Image I/O extensions understand. If either filename ends in a .jpg extension, then the TurboJPEG API will be used to compress or decompress the image. Compression Options (used if the output image is a JPEG image) -------------------------------------------------------------- -subsamp <444|422|420|gray> = Apply this level of chrominance subsampling when compressing the output image. The default is to use the same level of subsampling as in the input image, if the input image is also a JPEG image, or to use grayscale if the input image is a grayscale non-JPEG image, or to use 4:4:4 subsampling otherwise. -q <1-100> = Compress the output image with this JPEG quality level (default = 95). Decompression Options (used if the input image is a JPEG image) --------------------------------------------------------------- -scale M/N = Scale the input image by a factor of M/N when decompressing it. (M/N = 2/1, 15/8, 7/4, 13/8, 3/2, 11/8, 5/4, 9/8, 1/1, 7/8, 3/4, 5/8, 1/2, 3/8, 1/4, or 1/8) -hflip, -vflip, -transpose, -transverse, -rot90, -rot180, -rot270 = Perform one of these lossless transform operations on the input image prior to decompressing it (these options are mutually exclusive.) -grayscale = Perform lossless grayscale conversion on the input image prior to decompressing it (can be combined with the other transform operations above.) -crop WxH+X+Y = Perform lossless cropping on the input image prior to decompressing it. X and Y specify the upper left corner of the cropping region, and W and H specify the width and height of the cropping region. X and Y must be evenly divible by the MCU block size (8x8 if the input image was compressed using no subsampling or grayscale, 16x8 if it was compressed using 4:2:2 subsampling, or 16x16 if it was compressed using 4:2:0 subsampling.) General Options --------------- -display = Display output image (Output filename need not be specified in this case.) -fastupsample = Use the fastest chrominance upsampling algorithm available in the underlying codec. -fastdct = Use the fastest DCT/IDCT algorithms available in the underlying codec. -accuratedct = Use the most accurate DCT/IDCT algorithms available in the underlying codec. |
以下网站的jpeg图片,就是用了mozjpeg压缩的,可以前往测试效果