2019独角兽企业重金招聘Python工程师标准>>>
简单介绍
GraphicsMagick是ImageMagick的一个分支,相对于ImageMagick而言,TA处理速度更快,消耗资源更少。GraphicsMagick 是一个用来读写、生成超过90种图像格式的工具集合,支持包括 TIFF, JPEG, JPEG-2000,PNG, PDF, PhotoCD, SVG, 和GIF 等图像格式。GraphicsMagick 是基于 ImageMagick 开发的。
im4java是ImageMagick的另一个Java开源接口。与JMagick不同之处在于im4java只是生成与ImageMagick相对应的命令行,然后将生成的命令行传至选中的IM-command(使用java.lang.ProcessBuilder.start()实现)来执行相应的操作。它支持大部分ImageMagick命令,可以针对不同组的图片多次复用同一个命令行。im4java也是能够高清压缩图片,而且它也特别强大,至少一些基本常见的业务都是可以完美实现的。
Cropper是一款使用简单且功能强大的图片剪裁jQuery插件。该图片剪裁插件支持图片放大缩小,支持鼠标滚轮操作,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用。
技术选型
ImageCropper + GraphicsMagick + im4java + SpringMVC
ImageCropper官网: http://fengyuanchen.github.io/cropper/
GraphicsMagick官网: http://www.graphicsmagick.org/
im4java下载: http://sourceforge.net/projects/im4java/files/?source=navbar
处理逻辑
1、前端进行图片剪裁,并展示剪裁后的效果图;
2、点击确定后,将参数(x,y坐标,长宽,旋转角度)传到后端,并将图片上传至服务器,在调用im4java api进行图片处理。
3、返回处理后的图片路径,前端展示。
编程实现
图片剪裁处理类
package org.hcm.utils;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.im4java.core.ConvertCmd;
import org.im4java.core.IM4JavaException;
import org.im4java.core.IMOperation;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;public class ImageUtils {private static Log logger &#61; LogFactory.getLog(ImageUtils.class);/*** 保存文件** &#64;param inputStream* &#64;param path* &#64;param fileName*/public static void saveFileFromInputStream(InputStream inputStream, String path, String fileName) {File file &#61; new File(path &#43; fileName);FileOutputStream fs &#61; null;try {fs &#61; new FileOutputStream(file);byte[] buffer &#61; new byte[1024 * 1024];int byteread &#61; 0;while ((byteread &#61; inputStream.read(buffer)) !&#61; -1) {fs.write(buffer, 0, byteread);fs.flush();}} catch (FileNotFoundException e) {logger.error("File Not Found !", e);} catch (IOException e) {logger.error("", e);} finally {try {if (fs !&#61; null) {fs.close();}if (inputStream !&#61; null) {inputStream.close();}} catch (IOException e) {logger.error("", e);}}}/*** 裁剪图片* * &#64;param imagePath* 源图片路径* &#64;param newPath* 处理后图片路径* &#64;param x* 起始X坐标* &#64;param y* 起始Y坐标* &#64;param width* 裁剪宽度* &#64;param height* 裁剪高度* &#64;return 返回true说明裁剪成功,否则失败*/public static boolean cutImage(String imagePath, String newPath, int x, int y, int width, int height) {boolean flag &#61; false;try {IMOperation op &#61; new IMOperation();op.addImage(imagePath);/** width&#xff1a;裁剪的宽度 * height&#xff1a;裁剪的高度 * x&#xff1a;裁剪的横坐标 * y&#xff1a;裁剪纵坐标 */op.crop(width, height, x, y);op.addImage(newPath);ConvertCmd convert &#61; new ConvertCmd(true);convert.run(op);flag &#61; true;} catch (IOException e) {logger.error("读取文件出错", e);} catch (InterruptedException e) {logger.error("", e);} catch (IM4JavaException e) {logger.error("", e);}return flag;}/*** 根据尺寸缩放图片[等比例缩放:参数height为null,按宽度缩放比例缩放;参数width为null,按高度缩放比例缩放]* * &#64;param imagePath* 源图片路径* &#64;param newPath* 处理后图片路径* &#64;param width* 缩放后的图片宽度* &#64;param height* 缩放后的图片高度* &#64;return 返回true说明缩放成功,否则失败*/public static boolean zoomImage(String imagePath, String newPath, Integer width, Integer height) {boolean flag &#61; false;try {IMOperation op &#61; new IMOperation();op.addImage(imagePath);if (width &#61;&#61; null) { // 根据高度缩放图片op.resize(null, height);} else if (height &#61;&#61; null) { // 根据宽度缩放图片op.resize(width);} else {op.resize(width, height);}op.addImage(newPath);ConvertCmd convert &#61; new ConvertCmd(true);convert.run(op);flag &#61; true;} catch (IOException e) {logger.error("读取文件出错", e);} catch (InterruptedException e) {logger.error("", e);} catch (IM4JavaException e) {logger.error("", e);} return flag;}/*** 图片旋转* * &#64;param imagePath* 源图片路径* &#64;param newPath* 处理后图片路径* &#64;param degree* 旋转角度*/public static boolean rotate(String imagePath, String newPath, double degree) {boolean flag &#61; false;try {// 1.将角度转换到0-360度之间degree &#61; degree % 360;if (degree <&#61; 0) {degree &#61; 360 &#43; degree;}IMOperation op &#61; new IMOperation();op.addImage(imagePath);op.rotate(degree);op.addImage(newPath);ConvertCmd cmd &#61; new ConvertCmd(true);cmd.run(op);flag &#61; true;} catch (Exception e) {logger.error("图片旋转处理失败!", e);}return flag;}public static boolean imgProcessing(String srcPath, String destPath, int x, int y, int width, int height, double rotate) {boolean flag &#61; false;try {IMOperation op &#61; new IMOperation();op.addImage(srcPath);/** 旋转 */op.rotate(rotate);/** width&#xff1a;裁剪的宽度 * height&#xff1a;裁剪的高度 * x&#xff1a;裁剪的横坐标 * y&#xff1a;裁剪纵坐标 */op.crop(width, height, x, y);op.addImage(destPath);ConvertCmd convert &#61; new ConvertCmd(true);convert.run(op);flag &#61; true;} catch (IOException e) {logger.error("读取文件出错", e);} catch (InterruptedException e) {logger.error("", e);} catch (IM4JavaException e) {logger.error("", e);}return flag;}public static void main(String[] args) {
// ImageUtils.zoomImage("f://temp//test.jpg", "f://temp//test5.jpg", 200, 200);
// ImageUtils.rotate("f://temp//test1.jpg", "f://temp//test2.jpg", -90);
// ImageUtils.cutImage("f://temp//test5.jpg", "f://temp//test5.jpg", 32, 30, 200, 200);String data &#61; "{&#39;x&#39;:100.001, &#39;y&#39;:100.9}";System.out.println(data);JSONObject jsonData &#61; JSON.parseObject(data);System.out.println(jsonData.getIntValue("x"));System.out.println(jsonData.getIntValue("y"));}}
控制类
package org.hcm.controller;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;
import org.hcm.utils.ImageUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;&#64;Controller
&#64;RequestMapping(value &#61; "/image")
public class ImageController {&#64;RequestMapping(value &#61; "/upload", method &#61; RequestMethod.POST)public void upload(HttpServletRequest req, HttpServletResponse resp) throws IOException {Map
效果预览
&#xff08;完&#xff09;