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. 企业级mysql数据库完全备份、增量备份脚本

    企业完全备份脚本 [root@client ~]# vim /opt/mysql_bak_wanbei.sh #!/bin/bash #MySQL数据库完全备份脚本 #设置登录变量 MY_USER=& ...

  2. Java报表统计导出Word-xdocin方式

    官网:http://www.xdocin.com Controller层: //创建对象 XDocService xdocService = new XDocService(); //封装参数 Map ...

  3. 不抛异常的swap函数

    namespace AStuff{ template<typename T> class A { public: void swap(A *other) { using std::swap ...

  4. HDU 4027(线段树)

    HDU4027 题意:操作指令为0时,对区间[x,y]之间的数字进行开平方:指令为1的时候,对区间[x,y]之间的数字求和并输出: 思路:线段树处理就OK了,但是64位内的数最多开8次平方就为1了(开 ...

  5. 37.分组聚合操作—其他metric

    课程大纲     要学其他的metric(count,avg,max,min,sum) count:bucket,terms,自动就会有一个doc_count,就相当于是count avg:avg a ...

  6. Huawei-R&S-网络工程师实验笔记20190609-VLAN划分综合(Hybrid端口)

    >Huawei-R&S-网络工程师实验笔记20190609-VLAN划分综合(Hybrid端口) >>实验开始,先上拓扑图参考: >>>实验目标:分别实现主 ...

  7. 多层gmetad配置

    经实验表明: ①多层gmetad与ganglia版本无关,且可以多版本兼容 ②多层gmetad只有最底层gmetad能保存详细指标,非底层gmetad收集到的都只能是summary信息,当然也许我配置 ...

  8. Maven学习总结(5)——聚合与继承

    Maven学习总结(五)--聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 <modules> <module> ...

  9. Python之路【第一篇】:Python基础1

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  10. iphone照片查看器

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...