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. zepto处理touch事件

    处理Touch事件能让你了解到用户的每一根手指的位置,在touch事件触发的时候产生,可以通过touch event handler的event对象取到,如果基于zepto.js开发,一般是通过eve ...

  2. 集成学习_Bagging 和随机森林(rf)

       集成学习方式总共有3种:bagging-(RF).boosting-(GBDT/Adaboost/XGBOOST).stacking      下面将对Bagging 进行介绍:(如下图所示) ...

  3. git对vue项目进行版本管理

    生成本地仓库 步骤一:git init 步骤二:git add * 步骤三:git commit -m 'init team' 创建远程仓库 new responstory 复制关联代码的命令 将本地 ...

  4. PAT 1047. Student List for Course

    Zhejiang University has 40000 students and provides 2500 courses. Now given the registered course li ...

  5. group by语句,聚合函数与其他语句(关系,执行过程)

    (本文一切基于SQL SERVER 2008 R2) 先来看一个语句执行过程发生的错误提示: 消息 8120,级别 16,状态 1,第 2 行 选择列表中的列 'SC.CNO' 无效,因为该列没有包含 ...

  6. maven local responsitory 手工新增jar

    1.推荐几个好的 Maven 常用仓库网址:http://mvnrepository.com/http://search.maven.org/http://repository.sonatype.or ...

  7. 关于Spring的xml文档的简单实用配置

    Spring的spring.xml文档的配置 最近在写Spring的配置文件时,发现Spring文档的配置其实没必要那么繁琐记忆,网上的很多文章都写得很繁琐,如果所有的东西按照路径去查找,可以很快的帮 ...

  8. MVC.Net:读取Web.config/App.config配置

    需要读取Web.config/App.config的配置很简单,首先我们需要将配置写入到<appSettings>中,例如: <appSettings> <add key ...

  9. 什么是OTN交换?

    作者:Babak Samimi 大家不停地听到大数据的显著增长及其带来的全球运营商网络上流量的剧增. 比方.Qmee有一个有意思的infographic,在2013年捕捉了60秒的线上流量,其统计结果 ...

  10. 通过buildpath 导入jar和在lib下导入的jar包区别

    jar包放置在WEB-INF/lib下和通过build path导入的区别是什么? jar包直接拷贝到WEB-INF/lib下和以userLibrary形式引入的区别? jar包放置在WEB-INF/ ...