1. package com.jeeplus.modules.isp.utils;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8.  
  9. import org.apache.commons.lang3.SystemUtils;
  10. import org.im4java.core.ConvertCmd;
  11. import org.im4java.core.IM4JavaException;
  12. import org.im4java.core.IMOperation;
  13. import org.im4java.process.Pipe;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import com.jeeplus.modules.isp.service.impl.MongoFileServiceImp;
  17.  
  18. /**
  19. * 图片处理工具<br>
  20. * 代码实现类将图片装换压缩成固定的大小格式的图片<br>
  21. * 使用工具为im4java+GraphicsMagick-1.3.24-Q8<br>
  22. * 参考: <a href="http://im4java.sourceforge.net/">im4java</a><br>
  23. * GraphicsMagick: <a href="ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/windows/">下载</a><br>
  24. *
  25. * @author xiaofei.xian
  26. * @version
  27. * 1.0, 2016年8月8日 下午2:53:20
  28. */
  29. public class GraphicsMagicUtil {
  30.  
  31. private static Logger logger = LoggerFactory.getLogger(MongoFileServiceImp.class);
  32.  
  33. private static String GRAPHICS_MAGICK_PATH;
  34.  
  35. private static boolean IS_WINDOWS;
  36.  
  37. /**
  38. * 缩放图片大小
  39. *
  40. * @throws IM4JavaException
  41. * @throws InterruptedException
  42. * @throws IOException
  43. * @return
  44. */
  45. public static OutputStream zoomPic(OutputStream os, InputStream is, String contentType, Integer width, Integer height)
  46. throws IOException, InterruptedException, IM4JavaException {
  47. IMOperation op = buildIMOperation(contentType, width, height);
  48.  
  49. Pipe pipeIn = new Pipe(is, null);
  50. Pipe pipeOut = new Pipe(null, os);
  51.  
  52. ConvertCmd cmd = new ConvertCmd(true);
  53. if (IS_WINDOWS) {
  54. // linux下不要设置此值,不然会报错
  55. cmd.setSearchPath(GRAPHICS_MAGICK_PATH);
  56. }
  57. cmd.setInputProvider(pipeIn);
  58. cmd.setOutputConsumer(pipeOut);
  59. cmd.run(op);
  60. return os;
  61. }
  62.  
  63. /**
  64. * 压缩图片,返回输入流
  65. *
  66. * @param is
  67. * @param contentType
  68. * @param width
  69. * @param height
  70. * @return
  71. */
  72. public static InputStream convertThumbnailImage(InputStream is, String contentType, double width, double height) {
  73. try {
  74. IMOperation op = buildIMOperation(contentType, width, height);
  75.  
  76. Pipe pipeIn = new Pipe(is, null);
  77. ByteArrayOutputStream os = new ByteArrayOutputStream();
  78. Pipe pipeOut = new Pipe(null, os);
  79.  
  80. ConvertCmd cmd = new ConvertCmd(true);
  81. if (IS_WINDOWS) {
  82. // linux下不要设置此值,不然会报错
  83. cmd.setSearchPath(GRAPHICS_MAGICK_PATH);
  84. }
  85. cmd.setInputProvider(pipeIn);
  86. cmd.setOutputConsumer(pipeOut);
  87. cmd.run(op);
  88. return new ByteArrayInputStream(os.toByteArray());
  89. } catch (Exception e) {
  90. if (logger.isInfoEnabled()) {
  91. logger.info("Failed to convert image {}", e.getMessage());
  92. }
  93. return null;
  94. }
  95. }
  96.  
  97. /**
  98. * @param contentType
  99. * @param width
  100. * @param height
  101. * @return
  102. */
  103. private static IMOperation buildIMOperation(String contentType, Number width, Number height) {
  104. IMOperation op = new IMOperation();
  105.  
  106. String widHeight = width + "x" + height;
  107. op.addImage("-"); // 命令:处输入流中读取图片
  108. op.addRawArgs("-scale", widHeight);// 按照给定比例缩放图片
  109. op.addRawArgs("-gravity", "center"); // 缩放参考位置 对图像进行定位
  110. op.addRawArgs("-extent", width + "x" + height); // 限制JPEG文件的最大尺寸
  111. op.addRawArgs("+profile", "*");// 去除Exif信息
  112.  
  113. // 设置图片压缩格式
  114. op.addImage(contentType.substring(contentType.indexOf("/") + 1) + ":-");
  115. return op;
  116. }
  117.  
  118. public static void setGraphicsMagickPath(String graphicsMagickPath) {
  119. GraphicsMagicUtil.GRAPHICS_MAGICK_PATH = graphicsMagickPath;
  120. IS_WINDOWS = SystemUtils.IS_OS_WINDOWS;
  121. }
  122.  
  123. }

  

im4java+GraphicsMagick的更多相关文章

  1. app后端设计(13)--IM4JAVA+GraphicsMagick实现中文水印

    在app的后台中,有时候为了标示版权,需要给图片加上水印. 在liunx中,IM4JAVA+GraphicsMagick是个高效处理图片的方案,图片的裁剪是使用了这个技术方案,为了减少不必要的开发成本 ...

  2. im4java+GraphicsMagick 的问题

    1.convert.exe: non-conforming drawing primitive definition `' @ error/draw.c/RenderMVGContent/3901. ...

  3. graphicsMagick 文档

    ImageMagick资料 ---------------------------------------------------------------------------- ImageMagi ...

  4. ImageMagick简介、GraphicsMagick、命令行使用示例

    http://elf8848.iteye.com/blog/382528 ImageMagick资料 ------------------------------------------------- ...

  5. GraphicsMagick 号称图像处理领域的瑞士军刀

    标签: librarydelegatesimage图像处理fontstiff 2012-09-13 10:15 2496人阅读 评论(0) 收藏 举报  分类: java技术(52)  简介      ...

  6. app后端设计--总目录 (转)

    特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计( ...

  7. ImageMagick资料

    ImageMagick资料 ---------------------------------------------------------------------------- ImageMagi ...

  8. app后端设计--总目录

    做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,现就职于app云后端平台bmob(想了解bmob点击这里).其中的乐与苦 ...

  9. 23.app后端如何架设文件系统

    现在app展现内容的形式多种多样的,有文字,图片,声音,视频等等,其中文件占了一个很大的比重.随着app不断运营,文件会越来越多,占用的磁盘空间也不断增大,架设一套高效的文件系统,对于整个app架构有 ...

随机推荐

  1. mysql 如何用命令清除表数据,让表数据索引是从0开始呢?

    truncate MYTABLE 这样就可以了 其实这个命令就相当于删除表再建 所有的数据都还原 可以使用工具来完成这个操作 右键单击要操作的表,选择Turncale Table 执行查询语句,数据就 ...

  2. 利用 CSS animation 和 CSS sprite 制作动画

    CSS3 大大强化了制作动画的能力,但是如果要做出图案比较复杂的动画,选择 GIF 依然是一个不错的选择.今天给大家介绍一个使用 CSS animation 配合雪碧图(CSS sprite)来制作动 ...

  3. openstack——nova计算服务

    一.nova介绍               Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是 ...

  4. sysbench测试阿里云CPU

    参考 https://wiki.mikejung.biz/Benchmarking 买了一个1核的ECS,测试一下CPU性能 第一次是只用1个thread去跑 [root@iZwz9fy718twfi ...

  5. 利用WMITool解决浏览器快捷方式启动参数被篡改以及浏览器主页被劫持的问题

    先说说症状 症状①:通过快捷方式启动浏览器,首页跳转到2345以及hao123网址导航页,切系统内安装的多款浏览器(IE.Chrome.Firefox.Opera.Safari.Maxthon)症状相 ...

  6. mysql登录出现1045错误

    这个问题是在window server 2012上安装mysql之后, 远程访问时出现的1045错误 我新建了一个相同的用户用于远程访问, 密码也相同, 但是还是访问不了 参照链接:https://b ...

  7. Codeforces Round #427 (Div. 2)——ABCD

    http://codeforces.com/contest/835 A.拼英语水平和手速的签到题 #include <bits/stdc++.h> using namespace std; ...

  8. route 详解

    语法: [root@test root]# route [-nee] [root@test root]# route add [-net|-host]目标主机或网域[netmask] [gw|dev] ...

  9. Clojure:通过cursive连接远程REPL服务器

    配置很简单,步骤如下:1.    选择Edit Configurations…2.    选择Clojure REPL -> Remote3.    输入远程服务器的ip和端口. 最后点运行就可 ...

  10. HTML5:防止页面在移动设备上缩放

    在制作网页时,如果对移动设备有做兼容设计的话,通常是不希望页面在移动设备能够被缩放.这样可以防止原先设计好的样式被破坏.要做到这一点,只需要在网页的head部分加入如下语句即可: <!-- 屏蔽 ...