im4java+GraphicsMagick

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;
    }

}

  

时间: 2024-07-29 14:37:57

im4java+GraphicsMagick的相关文章

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

在app的后台中,有时候为了标示版权,需要给图片加上水印. 在liunx中,IM4JAVA+GraphicsMagick是个高效处理图片的方案,图片的裁剪是使用了这个技术方案,为了减少不必要的开发成本和运维成本,对应水印,我们是打算继续采用这个方案. 但在开发的过程中,发现这个方案对中文水印支持得不好. 根据网上的搜索结果,就算采用了im4java的GMOperation,并将水印的字符串转成GBK的编码,添加中文水印时,对于奇数个数的中文,没问题:但对于偶数个数的中文,就出现乱码了. 试了多次

graphicsMagick 文档

ImageMagick资料 ---------------------------------------------------------------------------- ImageMagick官网 ImageMagick Identify 命令行工具(官网) ImageMagick 程序接口文档 ImageMagick使用示例(非常好的示例) GraphicsMagick资料 ------------------------------------------------------

ios 下锁使用- 09-多线程

ios 下锁使用 时间:2014-08-08 15:36:56 总结下我所了解的ios下的锁: 1. 互斥锁 @synchronized,@synchronized块隐式的添加一个异常处理例程来保护代码.该处理例程会在异常抛出的时候自动的释放互斥锁.这意味着为了使用@synchronized指令,你必须在你的代码中启用异常处理. NSLock NSRecursiveLock,递归锁,一个线程中可以多次使用 NSConditionLock,条件锁,其实也是一种互斥锁:类似的有NSCondition

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

现在app展现内容的形式多种多样的,有文字,图片,声音,视频等等,其中文件占了一个很大的比重.随着app不断运营,文件会越来越多,占用的磁盘空间也不断增大,架设一套高效的文件系统,对于整个app架构有着巨大的影响. 1.    如果可能,使用成熟的文件云存储服务 对于创业公司来说,我一直推崇的架构原则是"尽量使用成熟的第三方服务和软件,自己只负责业务逻辑". 架设文件系统,需要牵涉到文件的分布式存储,图片水印,图片缩放,还有CDN等方面,每方面都能耗费掉巨大的开发成本和运维成本. 对于

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

特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计(5)-- 表情的处理 app后端设计(6)-- LBS app后端设计(7)-- 项目管理 app后端设计(8)-- 数据库分表 app后端设计(9)-- 动态通知 app后端设计(10)--数据增量更新 app后端设计(11)-- 系统架构 app后端设计(12)--图片的处理 app后端设计(1

app后端设计(php)

来源:http://blog.csdn.net/column/details/mobilebackend.html?page=1 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,现在从事日pv过5千万的云后端开发.其中的乐与苦,得与失,仰首问天有谁知?我觉得是时候来个总结,把相关的技术和心得记录下来. app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务

ImageMagick资料

ImageMagick资料 ---------------------------------------------------------------------------- ImageMagick官网 ImageMagick Identify 命令行工具(官网) ImageMagick 程序接口文档 ImageMagick使用示例(非常好的示例) GraphicsMagick资料 ------------------------------------------------------

GraphicsMagick+Im4Java在windows和linux下的配置

Im4Java包为: im4java-1.2.0.jar 直接在lib下引用即可 GraphicsMagick的安装如下: windows下: 安装:GraphicsMagick-1.3.12-Q16.zip 并配置GraphicsMagick的安装路径 linux下: 安装:GraphicsMagick-1.3.18.tar.gz 1. 解压GraphicsMagick-1.3.12.tar.gz包# tar -xvzf GraphicsMagick-1.3.12.tar.gz# cd Gra

Im4java+ImageMagick/GraphicsMagick

im4java的jar包可以在maven库中找到. <dependency> <groupId>org.im4java</groupId> <artifactId>im4java</artifactId> <version>1.4.0</version> </dependency> 将ImageMagick或者GraphicsMagick安装好后,再配好环境变量. 样例代码: import org.im4jav