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. log4net 局部代码 看不懂....

    public interface ILogger {} public interface ILoggerWrapper { ILogger Logger {get;} } public interfa ...

  2. 为Unity的新版ugui的Prefab生成预览图

    using UnityEngine;using System.Collections;using UnityEditor;using System.IO; [CustomPreview(typeof( ...

  3. .Net防sql注入的方法总结

    #防sql注入的常用方法: 1.服务端对前端传过来的参数值进行类型验证: 2.服务端执行sql,使用参数化传值,而不要使用sql字符串拼接: 3.服务端对前端传过来的数据进行sql关键词过来与检测: ...

  4. sql server的 between and 日期问题

  5. seleniumd对象的操作方法,属性,keys

    这是通过find方法找到的页面元素,此对象提供了多种方法,让我们可以与页面元素进行交互,例如点击.清空. 目录: 1. 方法 2. 属性 3. keys 方法 clear()清空 如果当前元素中有文本 ...

  6. CentOS 7.3降低内核版本为7.2

    查看当前内核版本: [root@nineep ~]# uname -r 2.3.10.0-514.2.2.el7.x86_64  查看当前发行版本: [root@nineep ~]# cat /etc ...

  7. elasticsearch 权威指南Mapping(映射)

    什么是映射 类似于数据库中的表结构定义,主要作用如下: 定义Index下字段名(Field Name) 定义字段的类型,比如数值型,字符串型.布尔型等 定义倒排索引的相关配置,比如是否索引.记录pos ...

  8. 混合了RBAC和ACL的权限系统(一) -- 用户组织结构

    最近的工作是一个基础设计,打造一个基于RBAC和ACL的权限基础组件. 这个基础组件的特点是:同时混合了RBAC和ACL的认证方式,也就是说同时提供系统级别的授权(RBAC)和对象级别的授权(ACL) ...

  9. Android:创建ZeroMQ的客户端

    这里我们将给出一个subscribe模式的客户端示例程序,如下: private class ZeroMQMessageTask extends AsyncTask<String, Void, ...

  10. Hard模式题目

    先过一下Hard模式的题目吧.   # Title Editorial Acceptance Difficulty Frequency   . 65 Valid Number     12.6% Ha ...