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

}

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GraphicsMagick号称图像处理领域的瑞士军刀。 短小精悍的代码却提供了一个鲁棒、高效的工具和库集合,来处理图像的读取、写入和操作,支持超过88种图像格式,包括重要的DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF。 通过使用OpenMP可是利用多线程进行图片处理,增强了通过扩展CPU提高处理能力。 GraphicsMagick可以在绝大多数的平台上使用,Linux、Mac、Windows都没有问题。 GraphicsMagick 支持大图片的处理,并且已经做过GB级别的图像处理实验。GraphicsMagick能够动态的生成图片,特别适用于互联网的应用。可以用来处理调整尺寸、旋转、加亮、颜色调整、增加特效等方面。GaphicsMagick不仅支持命令行的模式,同时也支持C、C++、Perl、PHP、Tcl、 Ruby等的调用。事实上,GraphicsMagick是从 ImageMagick 5.5.2 分支出来的,但是现在他变得更稳定和优秀,下面就是两个之间的一些比较。 GM更有效率(测评),能更快的完成处理工作 GM更小更容易安装 GM已经被Flickr和Etsy使用,每天处理百万计的图片 GM与已经安装的软件不会发生冲突 GM几乎没有安全问题 GM的手册非常丰富 im4java是ImageMagick的一个Java开源接口,使用起来非常方便。 很多网站都会用到对图片的一些处理,包括图片的裁剪、给图片加水印、按比例缩放图片等操作,用ImageMagick实现这些功能,性能非常好,图片还不会失真. 本文档详细的介绍了 GraphicsMagick+im4java的搭建过程,对一些搭建过程中出现的问题进行了详细的解答,避免采坑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值