仍旧是srping cloud的我的项目,因为图片需要变大,为了节俭空间和减速加载,打算把客户上传的图片进行压缩。为了省钱,先不必CDN,先把图片缩放大:)
1. Thumbnailator
专门用于压缩的jar包,很好用,只须要用引入我的项目就能够应用,反对固定大小,按比例放大等
官网给的例子参考 thumbnailator
2. ImageMagick
功能强大,不仅仅能压缩图片,还能做各种图片格式的互相转换,做各种图片特效解决,当初曾经反对比拟新的webp和avif格局。
官网imagemagick
3. GraphicsMagick
ImageMagick 的精简版分支,更适宜用作服务器部署,im提供的根底性能GM简直都反对,同样也反对webp格局(avif目前没有),大小比IM小,效率感觉比IM高。
官网graphicsmagick
抉择
我的我的项目始终是应用Thumbnailator 在进行压缩,然而是在须要用到的压缩的业务所在的服务,本人引入jar包去实现,这样做的形式很不便,却会产生很多反复的代码,尽管压缩的局部写成了共通办法,然而依然防止不了须要反复写很多上传和下载的模板接口。所以决定将图片上传,存储,查看,下载,做成根底微服务。咱们因为用户上传图片可能是手机相机拍照的会很大,所以打算将图片压缩为webp格局存储。当初大部分的古代浏览器都反对webp格局,并且咱们是基于小程序的我的项目,所以应该是没问题的。
基于以上起因,最初我选定了用GraphicsMagick+IM4java来实现在boot上构建图片压缩服务。IM4java是IM的一个javaApi,它应用命令行模式调用IM,当初IM4java也反对GraphicsMagick,然而官网有提到,一些GM不反对的命令行还是用不了的,毕竟是给IM用的。官网im4java上有很多参考。
装置
Thumbnailator 是jar包,间接援用就能够了。
ImageMagick 当初的版本是7,反对CenterOs 8,基于我的环境是CenterOs7 所以应用6的旧版本ImageMagick-6.9.12
GraphicsMagick 当初的版本是GraphicsMagick-1.3.36,我应用的是以后最新版本。
1.ImageMagick的装置
能够下载Rpm包装置,不过我应用的是从源码编译,因为我的服务器版本太低,所以本人编译源码
官网提供的源码编译流程
问题:
装置实现后,应用identify -version 或者 convert -list format 查看反对的文件类型。如果没找到须要的反对类型,就须要本人去装置额定的库。如果不反对xxx,那么就要去装置对应的libxxx 和 libxxx-devel包。比方不反对png ,就装置libpng 和libpng-devel包。在装置好这些额定库之后,须要从新编译装置IM
./configure --enable-shared #应用共享库#生成makefile没问题后编译装置make && make install
就能够了。
ps: 通常如果你的OS版本和他的提供的版本吻合的话,是不会呈现这种问题的。最好的解决方案还是找一个吻合的版本,因为即使是本人装库,也要找对应的版本(非常坑)
2.GraphicsMagick的装置
对于GraphicsMagick 我要阐明一下我的版本
CentOS Linux release 7.9.2009 个别装置流程就能够应用:)
CentOS Linux release 7.4.1708 装置会有问题:( 共享库装不下来,须要自定义装置共享库,而后指定共享库地位。
./configure LDFLAGS=-L/usr/local/lib (指定地位到/usr/local/lib
下载 GraphicsMagick-1.3.36.tar.gz 包,放到服务器上。
#解压tar -xvzf GraphicsMagick-1.3.36.tar.gz #进入GraphicsMagickcd GraphicsMagick-1.3.36
装置依赖库
yum install gcc gcc-c++ libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libwebp-devel libwebp
编译装置 指定能够解决的图像深度32位。应用共享库 ,不指定-prefix,则会装置在/usr/local/bin 参考Linux 命令详解./configure、make、make install 命令
#./configure --with-quantum-depth=32 --enable-sharedmake && make install
应用gm命令,如果不可用,在profile中配置
vi /etc/profile export PATH=$PATH:/usr/local/binsource /etc/profile
关联动态链接库地址,装置了一个新的动态链接库时,就须要手动运行lfconfig命令
sudo ldconfig /usr/local/lib
装置实现后 就能够应用 convert 命令测试了。
3. IM4java的应用
maven 引入
<dependency> <groupId>org.im4java</groupId> <artifactId>im4java</artifactId> <version>1.4.0</version> </dependency>
IM4Java 能够同时兼容IM和GM
上面是windows的例子
public static void im(){ //如果不配置环境变量就须要指定地位 String imPath="C:\\Program Files\\ImageMagick-6.9.12-Q16-HDRI"; ConvertCmd cmd = new ConvertCmd(); cmd.setSearchPath(imPath); // create command; // create the operation, add images and operators/options IMOperation op = new IMOperation(); op.addImage("D:\\temp\\pic\\1.jpg"); op.resize(1500,3000); op.define("webp:target-size=307200"); op.define("webp:pass=9"); op.addImage("D:\\temp\\pic\\40.webp"); try { cmd.run(op); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (IM4JavaException e) { e.printStackTrace(); } } public static void gm(){ String imPath="C:\\Program Files\\GraphicsMagick-1.3.36-Q16"; //和IM的区别,须要指定是是否要封装GM ConvertCmd cmd = new ConvertCmd(true); cmd.setSearchPath(imPath); // create command; // create the operation, add images and operators/options IMOperation op = new IMOperation(); op.addImage("D:\\temp\\pic\\1.jpg"); op.resize(1500,3000); op.define("webp:target-size=307200"); op.define("webp:pass=9"); op.addImage("D:\\temp\\pic\\gm40.webp"); try { cmd.run(op); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (IM4JavaException e) { e.printStackTrace(); } }
LINUX例子
public static void gm(){ //export之后 ConvertCmd cmd = new ConvertCmd(true); IMOperation op = new IMOperation(); op.addImage("../2M.jpg"); op.resize(1500,3000); op.define("webp:target-size=307200"); op.define("webp:pass=9"); op.addImage("../40.webp"); try { cmd.run(op); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (IM4JavaException e) { e.printStackTrace(); } }
没差,就是门路的区别而已。:)
顺带附送一下webp的google文档,对于一些参数设置有帮忙
google webp