package com.jeeplus.modules.isp.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import org.apache.commons.lang3.SystemUtils;
import org.im4java.core.ConvertCmd;
import org.im4java.core.IM4JavaException;
import org.im4java.core.IMOperation;
import org.im4java.process.Pipe;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jeeplus.modules.isp.service.impl.MongoFileServiceImp; /**
* 图片处理工具<br>
* 代码实现类将图片装换压缩成固定的大小格式的图片<br>
* 使用工具为im4java+GraphicsMagick-1.3.24-Q8<br>
* 参考: <a href="http://im4java.sourceforge.net/">im4java</a><br>
* GraphicsMagick: <a href="ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/windows/">下载</a><br>
*
* @author xiaofei.xian
* @version
* 1.0, 2016年8月8日 下午2:53:20
*/
public class GraphicsMagicUtil { private static Logger logger = LoggerFactory.getLogger(MongoFileServiceImp.class); private static String GRAPHICS_MAGICK_PATH; private static boolean IS_WINDOWS; /**
* 缩放图片大小
*
* @throws IM4JavaException
* @throws InterruptedException
* @throws IOException
* @return
*/
public static OutputStream zoomPic(OutputStream os, InputStream is, String contentType, Integer width, Integer height)
throws IOException, InterruptedException, IM4JavaException {
IMOperation op = buildIMOperation(contentType, width, height); Pipe pipeIn = new Pipe(is, null);
Pipe pipeOut = new Pipe(null, os); ConvertCmd cmd = new ConvertCmd(true);
if (IS_WINDOWS) {
// linux下不要设置此值,不然会报错
cmd.setSearchPath(GRAPHICS_MAGICK_PATH);
}
cmd.setInputProvider(pipeIn);
cmd.setOutputConsumer(pipeOut);
cmd.run(op);
return os;
} /**
* 压缩图片,返回输入流
*
* @param is
* @param contentType
* @param width
* @param height
* @return
*/
public static InputStream convertThumbnailImage(InputStream is, String contentType, double width, double height) {
try {
IMOperation op = buildIMOperation(contentType, width, height); Pipe pipeIn = new Pipe(is, null);
ByteArrayOutputStream os = new ByteArrayOutputStream();
Pipe pipeOut = new Pipe(null, os); ConvertCmd cmd = new ConvertCmd(true);
if (IS_WINDOWS) {
// linux下不要设置此值,不然会报错
cmd.setSearchPath(GRAPHICS_MAGICK_PATH);
}
cmd.setInputProvider(pipeIn);
cmd.setOutputConsumer(pipeOut);
cmd.run(op);
return new ByteArrayInputStream(os.toByteArray());
} catch (Exception e) {
if (logger.isInfoEnabled()) {
logger.info("Failed to convert image {}", e.getMessage());
}
return null;
}
} /**
* @param contentType
* @param width
* @param height
* @return
*/
private static IMOperation buildIMOperation(String contentType, Number width, Number height) {
IMOperation op = new IMOperation(); String widHeight = width + "x" + height;
op.addImage("-"); // 命令:处输入流中读取图片
op.addRawArgs("-scale", widHeight);// 按照给定比例缩放图片
op.addRawArgs("-gravity", "center"); // 缩放参考位置 对图像进行定位
op.addRawArgs("-extent", width + "x" + height); // 限制JPEG文件的最大尺寸
op.addRawArgs("+profile", "*");// 去除Exif信息 // 设置图片压缩格式
op.addImage(contentType.substring(contentType.indexOf("/") + 1) + ":-");
return op;
} public static void setGraphicsMagickPath(String graphicsMagickPath) {
GraphicsMagicUtil.GRAPHICS_MAGICK_PATH = graphicsMagickPath;
IS_WINDOWS = SystemUtils.IS_OS_WINDOWS;
} }

  

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. Redis 之hash集合结构及命令详解

    1.hset key field value   作用: 把key中 filed域的值设为value 注:如果没有field域,直接添加,如果有,则覆盖原field域的值 2.hmset key fi ...

  2. picturebox中添加图片

    private void Form1_Load(object sender, EventArgs e) { radioButton2.Checked = true; } private void ra ...

  3. 微信小程序animation

    wxml <view class="background" animation="{{rotateData}}"> </view>< ...

  4. iview Table表格单选框互斥

    表格中添加单选框,并且互斥 首先带data中定义   currentid : 0 :表示默认不选中 { title: "名称", key: "name", re ...

  5. webpack-dev-middleware 与 webpack-hot-middlware

    dev-middleware:  live reload的实现: 思考一下我們要如何更新(live reload)呢? 當然是需要取得 webpack 編好的資料啊,於是就需要在從 request 到 ...

  6. Chromium CEF 2623 -- 支持 xp 的最后一个版本源码下载和编译步骤

    背景 因为项目需要在客户端中内嵌浏览器,需要支持 xp 操作系统和播放视频,但 CEF 2623 以后的版本已经不支持 xp 操作系统,也不再提供 2623 版本的二进制发布包下载,只好自己手动编译. ...

  7. 【解题报告】洛谷 P1231 教辅的组成

    [解题报告]洛谷 P1231 教辅的组成 题目链接 CSDN链接 这道题就只是一道普通的最大流问题,但是关键所在就是如何构图.要不是我看了题解,真的想不到这个构图方法呢 题目大意我就不写了,自己看好了 ...

  8. gitblit 搭建本地git服务器

    本文主要描述gitblit搭建本地服务器

  9. 关于OpenCV图像操作的默认参数问题

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51559490 在使用OpenCV以及其 ...

  10. 给sunpinyin加速

    因为sunpinyin词库一大就会卡,因此需要自己添加一个脚本给sunpinyin加速. 加速的原理就是把词库添加到内存,现在内存都这么大,根本不在乎这么几兆,当然输入体验更重要啦- 首先先建一个脚本 ...