imagemagick图片合成例子
进来接到个需求,老板要求使用imagemagick合成图片,起初提的是直接使用java代码调用指令,后来发现imagemagick有对应的java客户端,不过网上资料不错,官网又被墙了,只能自己摸索着尝试
安装
参考 :https://www.cnblogs.com/yuanermen/p/3300457.html
https://www.cnblogs.com/yzeng/p/11569598.html
github关于imagemagick的介绍:https://github.com/ImageMagick/ImageMagick
也是在github的简介上,我发现了composite这个指令可以满足我的需求
这里安装在centos6上是验证的,其余系统不确定是否出问题
在安装软件本体之前,先安装依赖库,执行该指令一键安装
yum install tcl-devel libpng-devel libjpeg-devel ghostscript-devel bzip2-devel freetype-devel libtiff-devel
软件本体下载
https://www.imagemagick.org/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图片合成例子相关推荐
- php 图片合成,PHP中多张图片合成一张图片例子
今天分享一段PHP中多张图片合成一张图片的代码实现,我们可以在图片合成,水印,九宫格等需求下使用到类似这样的图片合成效果,下面一起来看看例子吧. 今天分享一段PHP中多张图片合成一张图片的代码实现,我 ...
- 图片合成gif_谈谈有哪些好用的制作GIF的方式
今天咱们谈谈计算机上几种制作 GIF 的方式,而且他们都是免费的,但可能需要你会一点计算机操作技能.本文会简单的介绍一些常用的GIF软件,比较一下功能和上手程度.常见的GIF录制方式大概有这么几种方式 ...
- 使用canvas在前端实现图片合成
看着总结的不错,我也就拿来主义了,做个记录,侵权必删 图片合成最常见的需求有验证码图片,亦或者图片加水印等,这种实现一般都是后端实现的. 随着HTML5发展和现代浏览器的占比越来越高,我们其实也可以在 ...
- h5 canvas html 合成,图片合成以及canvas的应用
使用 canvas 在前端实现图片合成 基本API // 绘制图片常用 API const canvas = document.createElement('canvas'); const ctx = ...
- python opencv PIL 视频分割成图片 图片合成为视频 修改图片大小(抗锯齿)
Python代码将原有的视频分割成图片,我的例子是一帧一帧的分割 用python+opencv完成视频的分割 import cv2 #导入opencv模块 print(2) #测试是否运行 vc=cv ...
- IOS 绘图 bitmap 滤镜 图片合成
CGSize size = CGSizeMake(800, 800);UIGraphicsBeginImageContextWithOptions(size, NO, 1);//1.获取bitmap上 ...
- Im4java接口调用ImageMagick图片处理服务简单demo学习
一.什么是ImageMagick ImageMagick是一套功能强大.稳定而且开源的工具集和开发包,可以用来读.写和处理超过200种基本格式的图片文件,包括PNG,JPEG,GIF,HEIC,TIF ...
- Java图片合成、base64转换
主要是工作中用到要将客户上传的身份证正反面照片从数据库中取出来(格式为base64字符串,竟然是将图片保存在数据库里面的),合成成为一张图片,然后再转码为base64,调用第三方接口把合成图片的bas ...
- 小猿圈web前端简述canvas如何实现二维码和图片合成
你经常看到活动海报什么的,上都是有各种宣传文案以及二维码形成的,你知道怎么用canvas实现二维码和图片合成,下面小猿圈Linux讲师为你详细介绍一下canvas如何实现二维码和图片合成的. 使用ur ...
最新文章
- 工业交换机是什么?矿用交换机采用的是工业级交换机吗?
- Spring整合JMS——基于ActiveMQ实现(一)
- 地图上绘制任意角度的椭圆_地图上的总椭圆
- 企业需要的C++程序员
- request获取各种路径记录
- 安装MySQL-python时发生错误:error: command 'gcc' failed with exit status 1
- 微服务框架Jersey:快速入门
- base16、base32和base64转码原理
- 关于移动端H5获取微信非静默授权被拦截进入【微信快照页】问题及解决方案
- 5G工业无线路由器的优势和应用场景
- 阿里云OSS配制域名及SSL证书教程
- sklearn中精确率、召回率及F1值得micro,macro及weighted算法
- 【智能手环APP for Android 】01 百度地图展示行动轨迹
- matlab倒立摆模型,线性倒立摆模型(LIP)Matlab建模.PDF
- matlab图像区域填充的原理_MATLAB中怎么用fill填充指定区域?
- 芒果iOS开发之NSComparisonResult比较结果
- 如何区分电容的正负极
- Go调用Python by go-python3
- 人类特有本能:保护族群老弱病残
- 运筹学-1-线性规划几种常见建模问题