Im4Java的安装文档见:http://blog.csdn.net/tangpengtao/article/details/9208047

JCrop的插件:jquery.Jcrop.js

jQuery之Jcrop

安装GraphicsMagick 和IM4JAVA:http://blog.sina.com.cn/s/blog_872758480100xufm.html

IM4Java的jar:im4java-1.2.0.jar

jcrop的调用js如下:

        /**
         * 上传头像成功后保存
         * @param file
         */
        uploadMyPicSuccess: function(file, data){
            var filePath = data.path; // 附件地址
            var width = data.width; // 原图宽度
            var height = data.height; // 原图高度
            var containWidth = 445;
            var containHeight = 314;
            
            var marginLeft = (containWidth - width) / 2;
            var marginTop = (containHeight - height) / 2;
            //截取区域的图片
            $("#img_1").css({width:width, height:height, "margin-left":marginLeft, "margin-top":marginTop})
                    .attr("src", fileURL+'/'+data.path);
                        //50*50规格
            $("#img_3").attr("src", fileURL+'/'+data.path);
                        //120*120规格
            $("#img_2").attr("src", fileURL+'/'+data.path);
            if(jcrop) jcrop.destroy();
             var jcrop = $.Jcrop("#img_1", {
                aspectRatio: 1,
                onChange: showPreview,
                 //showPreview为裁剪图片的function,后面写
                onSelect: showPreview,
                setSelect: [ 0, 0, 100, 100]
            });
            $(".jcrop-holder").css({"margin-left":marginLeft, "top":marginTop});
            
            //创建隐藏域,保存头像真实存储路径
            $("#newUrl").val(filePath);
            //点击预览按钮
            $("#previewBtn").show().click(function(){
                cropPic();
            });
            // 获取裁剪后的图片,预览
            function cropPic(){
                var mypic =$("#newUrl").val();
                $.ajax({
                    async: false,
                    type: "POST",
                    dataType:"json",
                    cache: false,
                    url: baseURL +"/userinfo/cropPic",//裁剪图片的action
                    data: "imageX=" +cropImage.x + "&imageY=" + cropImage.y + "&imageWidth=" + cropImage.w + "&imageHeight=" + cropImage.h + "&fileUrl=" + encodeURIComponent(mypic),
                    success: function(data){
                        if(data.success){
                            var smallPicUrl = data.path.split(",")[0];
                            var normalPicUrl = data.path.split(",")[1];
                            
                            // 创建隐藏域,保存小图
                            $("#smallUrl").val(smallPicUrl);
                            $("#img_3").attr("src", fileURL+"/" + smallPicUrl);
                            $("#img_2").attr("src", fileURL+"/" + normalPicUrl);
                            // 激活保存按钮
                            $("#saveBtn").show();
                            
                            
                        }
                    },
                    error:function(data){
                        alert("更新失败,请重新上传 ");
                    }
                });
            }         },

定义裁剪预览:

//图片裁剪预览
window.cropImage = {};
//选中裁剪内容后,获取裁剪坐标
function showPreview(coords){
cropImage.x = coords.x;
cropImage.y = coords.y;
cropImage.w = coords.w==0?1:coords.w;
cropImage.h = coords.h==0?1:coords.h;
}

图片处理:

1.图片上传后,假设显示图片的区域为413*350,则,上传后,把图片按原有的尺寸,等比裁减

    /**
* 上传个人头像
* @param request
* @param response
* @param file 上传的图片
* @param width 界面裁剪控件的宽度
* @param height 界面裁剪控件的高度
* @throws IOException
*/
@RequestMapping(value = "/uploadHeadPic")
public void uploadHeadPic(HttpServletRequest request,
HttpServletResponse response, @RequestParam("file")
MultipartFile file, @RequestParam(value="width",defaultValue="445")int width,
@RequestParam(value="height",defaultValue="314") int height) throws IOException {
if (logger.isDebugEnabled()) {
logger.debug("头像上传开始");
}
// 响应JSON
Map<String, Object> result = new HashMap<String, Object>();
boolean success = false;
String fileName = file.getOriginalFilename();
// 生成一个临时文件名
fileName = "tmp_" + GenUUIDHelper.genFileName(fileName);
if (FileUtils.isPicture(fileName)) {
Map<String, Object> r = fileManage.resizePicture(file.getInputStream(),fileName,request.getSession().getServletContext().getRealPath("/"), width, height);
String url = (String) r.get("path");
if (url != null) {
result.put("path", url.replace("\\", "/"));
result.put("width", r.get("width"));
result.put("height", r.get("height"));
success = true;
} else {
success = false;
}
}
result.put("success", success);
if (logger.isDebugEnabled()) {
logger.debug("swf上传结束");
}
// 输出响应,文件上传不支持ajax方式的响应contentType,所以不能使用ResponseBody
response.setCharacterEncoding(HttpUtil.ENCODING_UTF8);
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(response.getOutputStream(), JsonEncoding.UTF8);
objectMapper.writeValue(jsonGenerator, result);
response.getOutputStream().flush();
} catch (IOException e) {
logger.error("writeResponse", e);
} }

2.点击预览后,按尺寸 120*120 和 50*50裁减2张图片,并返回图片路径,做为预览图片

    /**
* 裁剪个人头像;
* @param request
* @param response
* @param x
* @param y
* @param width
* @param height
* @param fileUrl
* @throws Exception
*/
@RequestMapping(value = "/cropPic")
public void cropPic(HttpServletRequest request, HttpServletResponse response,
@RequestParam("imageX") Double x,
@RequestParam("imageY") Double y,
@RequestParam("imageWidth") Double width,
@RequestParam("imageHeight") Double height,
@RequestParam("fileUrl") String fileUrl) throws Exception{
if (logger.isDebugEnabled()) {
logger.debug("裁剪个人头像开始");
}
String contentPath=request.getSession().getServletContext().getRealPath("/");
fileUrl = contentPath + File.separator + fileUrl;
if (logger.isDebugEnabled()) {
logger.debug("fileUrl="+fileUrl);
}
Map<String, Object> resultMap = new HashMap<String, Object>();
File imgFile = new File(fileUrl);
if (imgFile.exists()) {
if (logger.isDebugEnabled()) {
logger.debug("imgFile.exists...........");
}
// 压缩并保存文件
String[] fileKey = fileManage.cropPicture(fileUrl, contentPath,x.intValue(), y.intValue(), width.intValue(), height.intValue());
resultMap.put("success", true);
resultMap.put("path", fileKey[0].replace("\\", "/") + "," + fileKey[1].replace("\\", "/"));
}else{
resultMap.put("success", false);
}
if (logger.isDebugEnabled()) {
logger.debug("swf裁剪个人头像结束");
} // 输出响应,文件上传不支持ajax方式的响应contentType,所以不能使用ResponseBody
response.setCharacterEncoding(HttpUtil.ENCODING_UTF8);
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(response.getOutputStream(), JsonEncoding.UTF8);
objectMapper.writeValue(jsonGenerator, resultMap);
response.getOutputStream().flush();
} catch (IOException e) {
logger.error("writeResponse", e);
}
}

3.共用的图片处理类:

@Component()
public class Im4JavaPictureHandle implements IPictureHandle {
private static Log logger = LogFactory.getLog(Im4JavaPictureHandle.class); @Override
public void cropImage(String srcPath, String newPath, int x, int y, int width,
int height, int saveWidth, int saveHeight) throws Exception { IMOperation op = new IMOperation();
op.addImage(srcPath); /**
* width:裁剪的宽度
* height:裁剪的高度
* x:裁剪的横坐标
* y:裁剪的挫坐标
*/
op.crop(width, height, x, y);
op.resize(saveWidth, saveHeight);
op.addImage(newPath); ConvertCmd convert = new ConvertCmd(true); //linux下不要设置此值,不然会报错
if(!System.getProperty("os.name").equals("Linux")&&!StringUtils.isNullOrEmpty(FileConsts.GRAPHICS_MAGICK_PATH))
{
convert.setSearchPath(FileConsts.GRAPHICS_MAGICK_PATH);
}
convert.run(op);
}
@Override
public int[] resizeImage(String srcPath, String newPath, int width,
int height) throws Exception {
int[] target = scaleWidthAndHight(srcPath,width,height);
width = target[0];
height = target[1];
IMOperation op = new IMOperation();
op.addImage(srcPath);
op.resize(width, height);
op.addImage(newPath); ConvertCmd convert = new ConvertCmd(true); //linux下不要设置此值,不然会报错
if(!System.getProperty("os.name").equals("Linux")&&!StringUtils.isNullOrEmpty(FileConsts.GRAPHICS_MAGICK_PATH))
{
convert.setSearchPath(FileConsts.GRAPHICS_MAGICK_PATH);
}
convert.run(op);
return target;
} public int[] scaleWidthAndHight(String srcPath,int w,int h) throws IOException{
Image srcImage = null;
int[] target = new int[2]; FileInputStream oldIs = new FileInputStream(srcPath); srcImage = javax.imageio.ImageIO.read(oldIs); //得到图片原始大小,以便按比例压缩
int width = srcImage.getWidth(null);
int height = srcImage.getHeight(null); // 特殊处理 当w和h均为0时,长,宽默认为图片原大小
if(w==0 && h==0){
w = width;
h = height;
}else if(h==0){ if(width>=w){
h = (int)Math.round((height * w * 1.0 / width));
}else{
w = width;
h = height;
}
}
else{ if ( width >= height){
if(width >= w){
h = (int)Math.round((height * w * 1.0 / width));
}else{
w = width;
h = height;
}
}else{
if(height >= h ){
w = (int)Math.round((width * h * 1.0 / height));
}else{
w = width;
h = height;
}
} }
target[0] = w;
target[1] = h;
oldIs.close();
return target;
}
}

在linux和windows下的安装分别如下:

http://www.cnblogs.com/jennybackup/p/3951935.html

JCrop+GraphicsMagick+Im4Java 实现图像裁减的更多相关文章

  1. GraphicsMagick+im4java 图片处理

    最近团队内部分享GraphicsMagick+im4java 图片处理 就把如何安装,运行都统一整理一下. 详细如下: 在windows上安装ImageMagick: download 地址:http ...

  2. GraphicsMagick+im4java实现高质量大图的处理

    http://www.open-open.com/lib/view/open1355754261963.html 做网站往往需要处理各种各样的图片,对于jdk自带的一套图片处理库,他的特点是稳定简单, ...

  3. GraphicsMagick+Im4Java在windows和linux下的配置

    GraphicsMagick介绍及安装 Im4Java包为: im4java-1.2.0.jar 直接在lib下引用即可 GraphicsMagick的安装如下: windows下: 安装:Graph ...

  4. GraphicsMagick +im4java高并发处理大型网站图片工具-图片剪切、遮蔽、水印添加之环境搭建

    环境: centos 6.5 GraphicsMagick 下载安装 准备环镜: 需要依赖zlib图片操作函数库 下载地址:http://www.zlib.net/ 编译安装 .tar.gz cd z ...

  5. GraphicsMagick 号称图像处理领域的瑞士军刀

    标签: librarydelegatesimage图像处理fontstiff 2012-09-13 10:15 2496人阅读 评论(0) 收藏 举报  分类: java技术(52)  简介      ...

  6. jQuery Jcrop API参数说明(中文版)(转)(图片剪切)

    Jcrop是一个jQuery图片裁剪插件,它能为你的WEB应用程序快速简单地提供图片裁剪的功能.特点如下: 对所有图片均unobtrusively(无侵入的,保持DOM简洁) 支持宽高比例锁定 支持 ...

  7. jQuery 图片裁剪插件 Jcrop

    Jcrop是一个jQuery图片裁剪插件,它能为你的WEB应用程序快速简单地提供图片裁剪的功能.特点如下: 对所有图片均unobtrusively(无侵入的,保持DOM简洁) 支持宽高比例锁定 支持 ...

  8. 海思h264解码库

    海思的dll,解码h264  解码后转出yuv12 dll自己百度下载  hi_h264dec.dll   hi_h264dec_w.dll   调用方法: if (H264Dec.Hi264DecA ...

  9. app后端设计(12)--图片的处理

    app上线后,不断接受用户的反馈,于是,反馈非常差的情况下,都会有app的改版. 一旦app的改版,都会有比较大的UI改动,一改动UI,那么图片的尺寸也就必须要改变. 在app后端设计(1)—api( ...

随机推荐

  1. 新手码农浅谈观察者模式(java语言简单实现)

    一:什么是观察者模式: 官方定义:定义对象间一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 举个例子,很多人都会订阅天气预报,当气象台获得明天的天气情况( ...

  2. 学习SVG系列(5):SVG渐变

    SVG渐变 渐变是一种从一种颜色到另一种颜色的平滑过渡,可以把多个颜色的过渡应用到同一个元素. 渐变有两种: Linear Redial 线性渐变-<linearGradient> lin ...

  3. 【Learning Python】【第二章】Python基础类型和基础操作

    基础类型: 整型: py 3.0解决了整数溢出的问题,意味着整型不必考虑32位,64位,有无符号等问题,你写一个1亿亿亿,就是1亿亿亿,不会溢出 a = 10 ** 240 print(a) 执行以上 ...

  4. web api 初体验 解决js调用跨域问题

    跨域界定 常见跨域: 同IP不同端口: http:IP:8001/api/user     http:IP:8002/api/user 不同IP不同端口: http://172.28.20.100:8 ...

  5. LVM逻辑卷的创建及使用

    在上一篇随笔里面 LVM逻辑卷基本概念及LVM的工作原理,详细的讲解了Linux的动态磁盘管理LVM逻辑卷的基本概念以及LVM的工作原理,包括LVM中最重要的四个基本点(PE.PV.VG以及LV),这 ...

  6. [GodLove]Wine93 Tarining Round #10

    比赛链接: http://www.bnuoj.com/v3/contest_show.php?cid=4159 题目来源: lrj训练指南---几何算法 Flag ID Title   A Board ...

  7. django中间件

    django的中间件就是一个对整体请求过程的装饰器,可以对请求到达view之前,view处理和响应后,通过定义process_request,process_view,process_response ...

  8. HTML 列表详解

    1.有序列表    有序列表是编号列表,用于对网页中的某些内容进行编号排列,以便使读者清晰地了解每行的顺序.在HTML中插入有序列表是通过<ol>和<li>标签来实现的.首标签 ...

  9. telnet -测试端口号

    点击计算机的开始菜单-->运行 ,输入CMD命令,然后确定.打开cmd命令行.   输入telnet测试端口命令: telnet IP 端口 或者 telnet 域名 端口 回车   如果端口关 ...

  10. CSS3如何去除 inline block 元素之间多出的空格

    display: inline-block 属性很好的避免了元素的浮动问题,但是会有点小问题,就是 inline-block 元素间的回车会被显示为一个空格.然而,我们写代码时,都是用回车来格式化的. ...