仍旧是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