im4java+GraphicsMagick
Posted 沽名钓誉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; } }
以上是关于im4java+GraphicsMagick的主要内容,如果未能解决你的问题,请参考以下文章
使用 im4java + gm4java 运行 GraphicsMagick 比较命令
GraphicsMagick +im4java高并发处理大型网站图片工具-图片剪切遮蔽水印添加之环境搭建