一、什么是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学习相关推荐

  1. 国际短信平台接口调用的方法步骤,简单5步快速教程

    如果您需要使用国际短信平台来满足您的业务需求,那么您需要了解短信平台接口调用的方法步骤. 接口调用是指您的应用程序通过网络接口与短信平台进行通信,从而实现向全世界发送短信的功能. 下面是国际短信平台接 ...

  2. CTF MISC图片隐写简单题学习思路总结(持续更新)

    系列文章目录 第一篇文章: CTF Crypto简单题学习思路总结(持续更新) 文章目录 系列文章目录 前言 一.JPG类隐写 1.1 JPG文件末尾添加字符串 1.2 JPG文件中添加字符串 1.3 ...

  3. RobotFrameWork接口报文测试-----(一)简单demo的实现

    最近几个月的工作任务都是通过使用RF工具来搭建服务器端接口的自动化测试,使用python作为2次开发的语言,也是第一次去做这种项目,经验善浅,还是很有可能会走很多的弯路,为此,我希望自己能把每个阶段的 ...

  4. android demo 调用,Android中调用C++函数的一个简单Demo

    这里我不想多解释什么,对于什么JNI和NDK的相关内容大家自己去百度或谷歌.我对Android的学习也只是个新手 .废话少说直接进入正题. 一.在Eclipse中创建一个Android Applica ...

  5. 营业执照识别api接口调用OCR识别

    营业执照识别 营业执照云识别 营业执照识别api产品描述 营业执照识别api开发的一款基于服务器平台的营业执照OCR识别服务程序,支持主流Windows.Linux 服务器平台.上传营业执照图像在服务 ...

  6. go-micro接口调用

    go-micro在微服务框架中提供了开箱即用的灵活接口,但是官方文档以及版本过于混乱,导致很难上手,初次使用很多调用都需要去阅读源码才能使用,微服务之间最核心的功能就是接口调用,当你使用go-micr ...

  7. 阿里云人脸识别接口调用卡顿,超时

    阿里云人脸识别接口调用卡顿 在服务端通过pom引入阿里云人脸识别sdk的时候,如果生产环境在内网开通了网络策略连接了 cloudauth.aliyuncs.com 这个地址. 但是sdk调用人脸识别服 ...

  8. VC++ 拖放编程简单Demo

    微软的编程类库都带有拖放编程的接口:下面看一个最简单demo:win7, vc6:新建一个对话框工程: 添加一个列表框控件:设置 接受文件 属性: 在 类向导-Class Info 做如下选择: 为W ...

  9. c# 调用restful json_微服务调用为啥用RPC框架,http不更简单吗?

    背景 在一次的面试交谈中,聊到业务实现的技术架构.不管系统大小,一般都是微服务的架构,所以就产生了一个问题,为什么服务之间调用,选择用RPC,http 不也能实现服务之间的通信吗?怎么不用呢?或者 R ...

最新文章

  1. [置顶] 决策树绘图(二)
  2. C++默认构造函数的一点说明
  3. 两个list关联合并_算法分享---两个有序链表的合并(C语言)
  4. java swing事件监听_Java swing(awt):事件监听机制的实现原理+简单示例
  5. Cloud for Customer的work center显示逻辑
  6. go 简单的RPC服务与客户端通讯
  7. 工作说明书(Statement of Work,简称SOW)
  8. SAP License:雾里看花系列——德国!SAP!中国企业!高管! SAP权限管控
  9. vue jsx webpack报错_从零开始,使用webpack高效搭建react工作流
  10. Windows系统端口占用,使用命令行查找并杀进程
  11. 数据结构与算法(三)-线性表之静态链表
  12. 你应该知道的Redis过期键和过期策略
  13. 高性能MySQL概述
  14. 维修iphone6无服务器,苹果6通病——插卡无服务维修思路和教程
  15. 哀悼日-全网变灰效果实现
  16. 使用HBuilder插件市场感悟
  17. 微信移动UI设计规范
  18. python打包whl文件
  19. Isight2019 集成MATLAB2019 (64位)的优化问题
  20. 自学Python:按照日期自动分类照片

热门文章

  1. 精密划片机切割常见的崩边问题
  2. Linux常用而且好玩的命令
  3. PHP笔记:设计电子公告牌
  4. 不容错过 免费ppt教程素材推荐
  5. 远程维护电脑设备,最好用的三款软件评测
  6. java毕业设计‘网上宠物店mybatis+源码+调试部署+系统+数据库+lw
  7. VS2015: warning MSB8012: TargetPath问题的解决
  8. 程序员招黑体质到底有多恐怖?原来我不经意间笑出了声!
  9. 华秋电子亮相2022深圳集成电路峰会
  10. 游戏配音需要做哪些工作?