进来接到个需求,老板要求使用imagemagick合成图片,起初提的是直接使用java代码调用指令,后来发现imagemagick有对应的java客户端,不过网上资料不错,官网又被墙了,只能自己摸索着尝试
安装
参考 :/yuanermen/p/3300457.html
/yzeng/p/11569598.html
github关于imagemagick的介绍:/ImageMagick/ImageMagick
也是在github的简介上,我发现了composite这个指令可以满足我的需求
这里安装在centos6上是验证的,其余系统不确定是否出问题
在安装软件本体之前,先安装依赖库,执行该指令一键安装
yuminstall tcl-devel libpng-devel libjpeg-devel ghostscript-develbzip2-devel freetype-devel libtiff-devel
软件本体下载
/download/ImageMagick.tar.gz
下载完毕后,我是在/usr/下新建一个文件夹,然后解压,进入解压后的目录依次执行
./configure 和 make && make install,最后执行 ldconfig /usr/local/lib,安装成功后会显示依赖库
这里有几个注意点,必须先安装依赖库,依赖库如果没装好,执行各种图片转换的时候会直接报错 No decode delegate for this image format ***,这种情况如果出现,重新安装依赖库,然后重新安装软件本体,如果重装不行可百度处理,多试几遍
其次,该软件需要gcc编译环境,如果缺少gcc会报错configure:error:no acceptable cc found in $path执行yum install gcc可以
进行安装,安装后恢复正常
使用
参考博客:
调用有两种方式
一种是直接使用java代码调linux指令
String[] cmd ={"/bin/sh", "-c","/usr/local/bin/composite -gravity center " +"/usr/imageMagick/ImageMagick-7.0.10-23/frog.jpeg " +"/usr/imageMagick/ImageMagick-7.0.10-23/duck.jpeg " +"/usr/picture/frogduck.png"};Runtime.getRuntime().exec(cmd);
比如这段代码,执行后会将forg.jpeg合并到duck.jpeg,生成的图片为png格式,位于/usr/picture下,三个参数,原图片,背景图,生成图,这里注意,调用指令需要指令的全路径,进入安装后的imagemagick目录下执行 whereis composite,即可知道composite指令所在位置,这段代码经过打包至tomcat运行测试有效
第二种,使用im4java客户端
imagemagick的java客户端有两种,jmagick和im4java,推荐im4java
引入依赖
<dependency>
<groupId>org.im4java</groupId>
<artifactId>im4java</artifactId>
<version>1.4.0</version>
</dependency>
这里说个题外话,博主的maven中央仓库怎么配置都找不到这个jar,最后是手动把它从mvn -re上下载下来然后安装到自己的maven仓库的,打war包的时候也是先打war包,发现war的lib目录下没有这个jar,然后用压缩软件直接打开war(不是解压缩,是直接打开),然后把jar复制到压缩文件里,大家别学,不规范
这里调用的composite方法,原图路径/usr/imageMagick/ImageMagick-7.0.10-23/smile.jpeg
背景图路径/usr/imageMagick/ImageMagick-7.0.10-23/duck.jpeg
生成图片路径/usr/picture/smileduck.png
BufferedImage buffimg = ImageIO.read(new File("/usr/imageMagick/ImageMagick-7.0.10-23/duck.jpeg"));int w = buffimg.getWidth();int h = buffimg.getHeight();Image watermarkImage = ImageIO.read(new File("/usr/imageMagick/ImageMagick-7.0.10-23/smile.jpeg"));//控制图片的位置IMOperation op = new IMOperation();op.geometry(watermarkImage.getWidth(null), watermarkImage.getHeight(null),w - watermarkImage.getWidth(null) - 320, h - watermarkImage.getHeight(null) - 330);op.addImage("/usr/imageMagick/ImageMagick-7.0.10-23/smile.jpeg");op.addImage("/usr/imageMagick/ImageMagick-7.0.10-23/duck.jpeg");op.addImage("/usr/picture/smileduck.png");ImageCommand cmd = new CompositeCmd(false);try {cmd.run(op);} catch (InterruptedException e) {e.printStackTrace();} catch (IM4JavaException e) {e.printStackTrace();}
这是duck.jpeg
这是smile.jpeg
这是smileduck.png,也就是最终的效果图,具体的图片按实际大小进行处理,我这里图片上传大小可能会变,请不要直接使用图片,换成自己的图片和路径测试下
这是linux下的运行测试,如果你安装的windows版本,记得配置path环境变量,并将你的imagemagick安装目录设置到上面的cmd对象的setSearchPath()方法中,不推荐使用windows测试,毕竟和开发环境完全不同。解释一下geometry方法,前两个参数是要插入图片的宽度和高度,后两个是控制插入图片的位置,距离背景图左侧和上侧的长度,如果我将 -320 换成-500,你会发现原图的位置在背景上左移了,使用背景图的长宽减去插入图长宽是为了保证移动的距离内不会丢失插入图片,否则可能丢掉插入图片的一部分
我想这个方法可以满足我的需求了,因为可以按要求调整插入图片的位置,大不了我把它们转换成比例,再设置参数
研究这个东西过程挺曲折的,安装依赖库当时没装好浪费不少时间,第一次用java调linux指令,问了不少人,试了很多次,一开始还不知道哪个指令有用,查了很多资料发现了composite,然后又找不到jar包依赖,我发现im4java的官网好像是挂了还是被墙了,反正访问不了,这写方法和参数是我自己在没有文档的情况下研究出来的,我这里看的只是合成图片,还有很多用途比如格式转换,旋转,加水印(类似合成)等等,可以看看我参考的那几篇博客,写得都很好,应该能给你一些帮助
如果觉得《imagemagick图片合成例子》对你有帮助,请点赞、收藏,并留下你的观点哦!