Im4java接口调用ImageMagick图片处理服务简单demo学习
一、什么是ImageMagick
ImageMagick是一套功能强大、稳定而且开源的工具集和开发包,可以用来读、写和处理超过200种基本格式的图片文件,包括PNG,JPEG,GIF,HEIC,TIFF,DPX,EXR,WebP,Postscript,PDF和SVG等格式。利用ImageMagick,可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,既可以通过命令行进行,也可以通过C/C++、Perl、Java、PHP、Python或Ruby编程来完成。
二、 什么是Im4java
Im4java是ImageMagick服务开放的的第二个java接口。
三、本博客包含学习功能
旋转图片,裁剪图片,缩放图片,压缩图片,文字水印,图片水印,获取图片信息
四、代码demo
import org.im4java.core.*; import org.im4java.process.ArrayListOutputConsumer;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Map;public class Im4JavaUtils {//代码中ImageMagick安装包的地址private static final String IMAGE_MAGICK_PATH = "E:\\idea_work_space\\zgrs2\\tools\\windows\\ImageMagick-7.0.8-Q16";//源图片目录public static final String SRC_IMAGE_PATH = "E:\\gx\\old\\";//新图片目录public static final String NEW_IMAGE_PATH = "E:\\gx\\new\\";//水印图片地址public static final String APPEND_IMAGE_PATH = "E:\\gx\\old\\timg.png";public static void main(String[] args) {//旋转图片//Im4JavaUtils.roateImage(SRC_IMAGE_PATH + "1.jpg", NEW_IMAGE_PATH + "1.jpg", 90.0);//裁剪图片//Im4JavaUtils.cutImage(SRC_IMAGE_PATH + "1.jpg", NEW_IMAGE_PATH + "1.jpg", 100, 100, 100, 100);//缩放图片//Im4JavaUtils.zoomImage(SRC_IMAGE_PATH + "1.jpg", NEW_IMAGE_PATH + "1.jpg", 400, 270);//压缩图片//Im4JavaUtils.compressImage(SRC_IMAGE_PATH + "1.jpg", NEW_IMAGE_PATH + "1.jpg", 50.0);//加文字水印//Im4JavaUtils.textImage(SRC_IMAGE_PATH + "1.jpg", NEW_IMAGE_PATH + "1.jpg", "TEST");//加图片水印Im4JavaUtils.compositeImage(SRC_IMAGE_PATH + "1.jpg", NEW_IMAGE_PATH + "1.jpg", APPEND_IMAGE_PATH, 50);System.out.println("======获取图片信息=====");Map<String, String> imageInfo = Im4JavaUtils.getImageInfo(SRC_IMAGE_PATH + "1.jpg");for (String key : imageInfo.keySet()) {System.out.println(key + " : " + imageInfo.get(key));}System.out.println("======获取图片信息=====");}enum CommandType {/*** 转换处理*/convert("转换处理"), composite("图片合成"), identify("图片信息"),;private String name;CommandType(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}private static ImageCommand getImageCommand(CommandType command) {ImageCommand cmd = null;switch (command) {case convert:cmd = new ConvertCmd();break;case composite:cmd = new CompositeCmd();break;case identify:cmd = new IdentifyCmd();break;default:break;}if (cmd != null) {cmd.setSearchPath(IMAGE_MAGICK_PATH);}return cmd;}/*** 旋转图片** @param srcImagePath 原图片地址* @param newImagePath 新图片地址* @param degree 旋转角度* @return*/public static boolean roateImage(String srcImagePath, String newImagePath, Double degree) {try {IMOperation op = new IMOperation();op.addImage(srcImagePath);op.rotate(degree);op.addImage(newImagePath);ImageCommand convert = getImageCommand(CommandType.convert);convert.run(op);System.out.println("旋转图片成功");} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 裁剪图片** @param srcImagePath 原图片地址* @param newImagePath 新图片地址* @param width 裁剪后的宽度* @param height 裁剪后的高度* @param x 起始横坐标* @param y 起始纵坐标* @return*/public static boolean cutImage(String srcImagePath, String newImagePath, Integer width, Integer height, Integer x, Integer y) {try {IMOperation op = new IMOperation();op.addImage(srcImagePath);op.crop(width, height, x, y);op.addImage(newImagePath);ImageCommand convert = getImageCommand(CommandType.convert);convert.run(op);System.out.println("裁剪图片成功");} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 缩放图片** @param srcImagePath 原图片地址* @param newImagePath 新图片地址* @param width 缩放后的宽度* @param height 缩放后的高度* 高度和宽度需符合图片比例,不符合的情况下,以其中最小值为准。* @return*/public static boolean zoomImage(String srcImagePath, String newImagePath, Integer width, Integer height) {try {IMOperation op = new IMOperation();op.addImage(srcImagePath);op.resize(width, height);op.addImage(newImagePath);ImageCommand convert = getImageCommand(CommandType.convert);convert.run(op);System.out.println("缩放图片成功");} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 压缩图片** @param srcImagePath 原图片地址* @param newImagePath 新图片地址* @param quality 压缩比例* 图片压缩比,有效值范围是0.0-100.0,数值越大,缩略图越清晰。* @return*/public static boolean compressImage(String srcImagePath, String newImagePath, Double quality) {try {IMOperation op = new IMOperation();op.addImage(srcImagePath);op.quality(quality);op.addImage(newImagePath);ImageCommand convert = getImageCommand(CommandType.convert);convert.run(op);System.out.println("压缩图片成功");} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 文字水印** @param srcImagePath 原图片地址* @param newImagePath 新图片地址* @param content 水印文字,不支持汉字* @return*/public static boolean textImage(String srcImagePath, String newImagePath, String content) {try {IMOperation op = new IMOperation();op.addImage(srcImagePath);//右下角op.font("ArialBold").gravity("southeast").pointsize(60).fill("#F2F2F2").draw("text 10,10 " + content);op.addImage(newImagePath);ImageCommand convert = getImageCommand(CommandType.convert);convert.run(op);System.out.println("添加文字水印成功");} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 图片水印** @param srcImagePath 原图片地址* @param newImagePath 新图片地址* @param appendImagePath 水印图片地址* @param dissolve 水印透明度,0-100* @return*/public static boolean compositeImage(String srcImagePath, String newImagePath, String appendImagePath, Integer dissolve) {try {//原图片信息BufferedImage bufferedImage = ImageIO.read(new File(srcImagePath));int w = bufferedImage.getWidth();int h = bufferedImage.getHeight();//水印图片信息Image image = ImageIO.read(new File(appendImagePath));int w1 = image.getWidth(null);int h1 = image.getHeight(null);IMOperation op = new IMOperation();op.geometry(w1, h1, w - w1 - 10, h - h1 - 10);op.dissolve(dissolve);op.addImage(appendImagePath);op.addImage(srcImagePath);op.addImage(newImagePath);ImageCommand composite = getImageCommand(CommandType.composite);composite.run(op);System.out.println("添加图片水印成功");} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 获取图片信息** @param imagePath 图片地址* @return*/public static Map<String, String> getImageInfo(String imagePath) {Map<String, String> imageInfo = new HashMap<>();try {IMOperation op = new IMOperation();op.format("%w,%h,%d/%f,%Q,%b,%e");op.addImage();//注意这里,用的是identifyImageCommand identifyCmd = getImageCommand(CommandType.identify);ArrayListOutputConsumer output = new ArrayListOutputConsumer();identifyCmd.setOutputConsumer(output);identifyCmd.run(op, imagePath);ArrayList<String> cmdOutput = output.getOutput();String[] result = cmdOutput.get(0).split(",");if (result.length == 6) {imageInfo.put("宽度", result[0]);imageInfo.put("高度", result[1]);imageInfo.put("路径", result[2]);imageInfo.put("质量", result[3]);imageInfo.put("大小", result[4]);imageInfo.put("格式", result[5]);}} catch (Exception e) {e.printStackTrace();}return imageInfo;}}
五、pom依赖引入
<dependency><groupId>org.im4java</groupId><artifactId>im4java</artifactId><version>1.4.0</version> </dependency>
Im4java接口调用ImageMagick图片处理服务简单demo学习相关推荐
- 国际短信平台接口调用的方法步骤,简单5步快速教程
如果您需要使用国际短信平台来满足您的业务需求,那么您需要了解短信平台接口调用的方法步骤. 接口调用是指您的应用程序通过网络接口与短信平台进行通信,从而实现向全世界发送短信的功能. 下面是国际短信平台接 ...
- CTF MISC图片隐写简单题学习思路总结(持续更新)
系列文章目录 第一篇文章: CTF Crypto简单题学习思路总结(持续更新) 文章目录 系列文章目录 前言 一.JPG类隐写 1.1 JPG文件末尾添加字符串 1.2 JPG文件中添加字符串 1.3 ...
- RobotFrameWork接口报文测试-----(一)简单demo的实现
最近几个月的工作任务都是通过使用RF工具来搭建服务器端接口的自动化测试,使用python作为2次开发的语言,也是第一次去做这种项目,经验善浅,还是很有可能会走很多的弯路,为此,我希望自己能把每个阶段的 ...
- android demo 调用,Android中调用C++函数的一个简单Demo
这里我不想多解释什么,对于什么JNI和NDK的相关内容大家自己去百度或谷歌.我对Android的学习也只是个新手 .废话少说直接进入正题. 一.在Eclipse中创建一个Android Applica ...
- 营业执照识别api接口调用OCR识别
营业执照识别 营业执照云识别 营业执照识别api产品描述 营业执照识别api开发的一款基于服务器平台的营业执照OCR识别服务程序,支持主流Windows.Linux 服务器平台.上传营业执照图像在服务 ...
- go-micro接口调用
go-micro在微服务框架中提供了开箱即用的灵活接口,但是官方文档以及版本过于混乱,导致很难上手,初次使用很多调用都需要去阅读源码才能使用,微服务之间最核心的功能就是接口调用,当你使用go-micr ...
- 阿里云人脸识别接口调用卡顿,超时
阿里云人脸识别接口调用卡顿 在服务端通过pom引入阿里云人脸识别sdk的时候,如果生产环境在内网开通了网络策略连接了 cloudauth.aliyuncs.com 这个地址. 但是sdk调用人脸识别服 ...
- VC++ 拖放编程简单Demo
微软的编程类库都带有拖放编程的接口:下面看一个最简单demo:win7, vc6:新建一个对话框工程: 添加一个列表框控件:设置 接受文件 属性: 在 类向导-Class Info 做如下选择: 为W ...
- c# 调用restful json_微服务调用为啥用RPC框架,http不更简单吗?
背景 在一次的面试交谈中,聊到业务实现的技术架构.不管系统大小,一般都是微服务的架构,所以就产生了一个问题,为什么服务之间调用,选择用RPC,http 不也能实现服务之间的通信吗?怎么不用呢?或者 R ...
最新文章
- [置顶] 决策树绘图(二)
- C++默认构造函数的一点说明
- 两个list关联合并_算法分享---两个有序链表的合并(C语言)
- java swing事件监听_Java swing(awt):事件监听机制的实现原理+简单示例
- Cloud for Customer的work center显示逻辑
- go 简单的RPC服务与客户端通讯
- 工作说明书(Statement of Work,简称SOW)
- SAP License:雾里看花系列——德国!SAP!中国企业!高管! SAP权限管控
- vue jsx webpack报错_从零开始,使用webpack高效搭建react工作流
- Windows系统端口占用,使用命令行查找并杀进程
- 数据结构与算法(三)-线性表之静态链表
- 你应该知道的Redis过期键和过期策略
- 高性能MySQL概述
- 维修iphone6无服务器,苹果6通病——插卡无服务维修思路和教程
- 哀悼日-全网变灰效果实现
- 使用HBuilder插件市场感悟
- 微信移动UI设计规范
- python打包whl文件
- Isight2019 集成MATLAB2019 (64位)的优化问题
- 自学Python:按照日期自动分类照片