jcrop为基于jquery库实现的图片裁切插件。当使用该插件使需要引入jquery和jcrop(包括js文件和css文件)。

 //css文件的引入<link rel="stylesheet" type="text/css" href="/Jcrop/css/jquery.Jcrop.min.css">//js文件的引入<script type="text/javascript" src="javascripts/jquery.js"></script>
<script type="text/javascript" src="/Jcrop/js/jquery.Jcrop.js"></script>

在项目中,需要实现当点击上传图片时,出现弹出框对上传的图片进行裁切,裁切完成后。点击提交按钮,改变用户的头像。

实现的过程如下:

  1. 点击上传图片按钮,触发ajax请求,将图片上传。上传成功后,触发ajax的回调函数,出现弹出框。
  2. 在弹出框中显示要上传的图片,并且将该图片作为jcrop的实例,对图像进行裁切,同时显示裁切图片的预览图
  3. 点击提交按钮,将jcrop的处理结果作为参数,提交请求。其中jcrop的参数包括相对于原图像的裁切的起点坐标以及裁切的宽度。
  4. 后台处理上传的图片和图片的裁切

前端代码如下

EventUtil.addHandler(userImgUpload, "change", function(e){var e = EventUtil.getEvent(e);//上传图片 当上传成功后  触发弹出框var formd = new FormData();formd.append("file",this.files[0]);ajax("post","userSet/imgupload", null, formd, function(res){var str = "<div class='img-wrap'><div class='upload-origin'><img id='upload-img' src="+JSON.parse(res).img+"></img></div><div class='pre-img'><span id='pre-big'><img id='crop-pre-big' src="+JSON.parse(res).img+"></span><span id='pre-middle'><img id='crop-pre-middle' src="+JSON.parse(res).img+"></span><span id='pre-small'><img id='crop-pre-small' src="+JSON.parse(res).img+"></span></div><input type='hidden' id='x' name='x' />"+"<input type='hidden' id='y' name='y' />"+"<input type='hidden' id='w' name='w' />"+"<input type='hidden' id='h' name='h' />";//Popular为弹出框类var pop2 = document.querySelector('.p2');var p2 = Popuper({wrap: pop2,type: 'success',//confirm: uploadImg,cancel: function() {alert('cancel callback');}}).edit({title: '头像上传',content: str}).show();p2.toggle().edit({type:'info'});//当图片加载完后增加jcrop类$("#upload-img").on("load",function(){console.log("cheng");console.log($("#upload-img"));var api = $.Jcrop("#upload-img",{boxWidth:300,boxHeight:300,onChange:showPreview,onSelect:showPreview,aspectRatio:1})//初始化选区框的宽高为min(width,height)api.setSelect([$("#upload-img").width()>$("#upload-img").height()?1/2*($("#upload-img").width()-$("#upload-img").height()):0,$("#upload-img").width()>$("#upload-img").height()?0:1/2*($("#upload-img").height()-$("#upload-img").width()),$("#upload-img").width()>$("#upload-img").height()?1/2*($("#upload-img").width()+$("#upload-img").height()):$("#upload-img").height(),$("#upload-img").width()>$("#upload-img").height()?$("#upload-img").height():1/2*($("#upload-img").height()+$("#upload-img").width())]);})})})//当选区框改变时触发的操作function showPreview(coords){console.log(coords);//返回的是相对于原图像裁切的宽高信息$("#x").val(coords.x);$("#y").val(coords.y);$("#w").val(coords.w);$("#h").val(coords.h);//预览图的生成 通过改变图片的宽高if(parseInt(coords.w)>0){var bigRx = $("#pre-big").width()/coords.w;var bigRy = $("#pre-big").height()/coords.h;console.log(bigRx)$("#crop-pre-big").css({width:Math.round(bigRx*$("#upload-img").width())+"px",height:Math.round(bigRy*$("#upload-img").height())+"px",marginLeft:"-"+Math.round(bigRx*coords.x)+"px",marginTop:"-"+Math.round(bigRy*coords.y)+"px"})var middleRx = $("#pre-middle").width()/coords.w;var middleRy = $("#pre-middle").height()/coords.h;$("#crop-pre-middle").css({width:Math.round(middleRx*$("#upload-img").width())+"px",height:Math.round(middleRy*$("#upload-img").height())+"px",marginLeft:"-"+Math.round(middleRx*coords.x)+"px",marginTop:"-"+Math.round(middleRy*coords.y)+"px"})var smallRx = $("#pre-small").width()/coords.w;var smallRy = $("#pre-small").height()/coords.h;$("#crop-pre-small").css({width:Math.round(smallRx*$("#upload-img").width())+"px",height:Math.round(smallRy*$("#upload-img").height())+"px",marginLeft:"-"+Math.round(smallRx*coords.x)+"px",marginTop:"-"+Math.round(smallRy*coords.y)+"px"})}}$('#crop-form').submit(function(event) {event.preventDefault() });//点击提交按钮时 将form表单以ajax方式提交 $("#upload-submit").on("click",function(e){e.stopPropagation();console.log("fjkdfajk");$.ajax({url:"/upload/imgupload/size",type:"POST",data:$("#crop-form").serialize(),success:function(res){console.log(res);}})})

对于后端的处理,本文使用的是nodejs

首先是处理上传图片,这里使用的是multer包,上传代码如下:

app.post('/userset/imgupload',upload.single("file"),function(req,res){
//将信息存入文章数据库
var path = "/uploads/"+req.file.filename;
console.log("user");
console.log(req.session.user);
User.update({name: req.session.user.name},{img:path},function(err){if(err){console.log(err);}res.send({img: path})
})
})

当该后台代码执行完成后,触发ajax请求 对图片进行裁切

当裁切完成后,触发ajax请求,将裁切的尺寸和裁切的起点传给后台服务器 ,后台服务器需要裁切图片,这里需要引入imageMagick。imageMagick可以裁剪图片、重置图片大小以及添加水印等操作,具体使用方法请参照gm官方文档。在这里需要注意,引入该包之前需要在本地安装imageMagick。安装完之后在项目中引入imageMagick包,安装imageMagick包和gm包

npm install imageMagick
npm install gm

处理裁切的主要程序如下:

var fs = require('fs');
var gm = require('gm').subClass({imageMagick:true});
var path = require('path');
//param为json对象,包括图片的起始位置和图片裁切的宽度和高度
function ImgCrop(param,callback){//新文件的路径 var imgdir = path.dirname(param.path);var base = path.basename(param.path);var filename = base.split('.')[0];var newfile = filename + param.rWidth;var newpath = path.join(imgdir,newfile+path.extname(param.path));//crop:裁切 resize:重置尺寸 stream:将文件以流的形式读取gm(path.join("./public", param.path)).crop(param.width,param.height,param.x,param.y).resize(param.rWidth,param.rHeight).stream(function(err,stdout){if(err){throw err;}//将文件写入指定路径var writeStream = fs.createWriteStream(path.join("./public", newpath));stdout.pipe(writeStream)//这里需要注意path.join连接后的路径以反斜杠分割,这里将反斜杠转化为斜杠callback(null,newpath.replace(/\\/g,"\/"));})
}
module.exports = ImgCrop;

当使用该模块时 需要引入该模块,并调用

var imgcrop = require('../models/imgcrop.js');
imgcrop({path:user.img,width:req.body.w,height:req.body.h,x:req.body.x,y:req.body.y,rWidth:200,rHeight:200},function(err,newpath){User.update({name: req.session.user.name},{bigimg:newpath},function(err){if(err){console.log(err);}res.send({img: newpath})})

最后裁切时的截图截图如下

使用jcrop实现裁切图片相关推荐

  1. javacript 裁切图片

    前言 略 javacript 裁切图片 cropper(demo) Jcrop(demo) cropper Jcrop

  2. C#开发:不规则裁切图片

    C#使用GDI+可以创建,修改图片,创建图片的bitmap,使用Graphics在图片上勾画元素,点.线.面等. 规则的图片裁切,设置图片的方形或者圆形的方式,就能直接进行图片的裁切.裁切使用jpg保 ...

  3. php imagick 图片裁切,php Imagick , 怎么使用Imagick裁切图片

    php Imagick 求助, 如何使用Imagick裁切图片 我需要 景某个PDF文档中的某一页裁切其中一部分, 生成一新的png格式的文档. gd不支持PDF格式, Imagick 支持打开pdf ...

  4. Python 基于透明元素裁切图片(类似Photoshop)

    文章目录 问题描述 解决方案 参考文献 本文测试图像及其代码下载 问题描述 实现类似Photoshop的基于透明元素裁切图片 1.png 2.jpg 3.png 4.png 5.png 6.png 解 ...

  5. Node 裁切图片的方法

            1.安装 jimp $ npm install --save jimp         2.读取本地图片切图 jimp.read('本地图片地址', function (err, im ...

  6. Rasterino 2.3.0版for AI 2020 (Illustrator裁切图片一键PS修图插件)

    转载自亿品元素 原文链接:http://www.epinv.com/post/8147.html Rasterino v2.3.0 64bit版(支持AI 2020).Rasterino是一款非常实用 ...

  7. 小米7.0 android 图片裁剪失败,Android 7.0适配 -- FileProvider 拍照、选择相册、裁切图片, 小米机型适配...

    需求: 最近把APP的TargetSdk从21提高至25后,测试时, 在Android7.0以上的系统上,爆出了一些异常. 在个别小米等机型也存在一些异常. 问题分析: FileUriExposedE ...

  8. 怎么用懒设计工具在线裁切图片?

    当我们拍摄一张图片后,可能会因为各种各样的原因需要对图片进行裁切,在裁切时要保证图片的原有的色彩饱和度,同时还要按照制定尺寸大小进行裁切,目前可用于裁切图片的工具是比较多的了,懒设计就是一款可以在线裁 ...

  9. Vue + ccropper.js裁切图片(vue-cropper)

    有什么问题可以加我的微信,有问必答. 致力于技术分享 按原比例裁切图片,不失真 安装: cnpm install vue-cropper 使用: import VueCropper from 'vue ...

最新文章

  1. pthreads 的学习
  2. 【数据竞赛】99%情况下都有效的特征筛选策略--Null Importance。
  3. PJSIP学习笔记——PJSUA层发起呼叫的主要流程
  4. java 百度api接口开发_百度熊掌号使用Java工具类对接API推送接口进行文章推送实例详解...
  5. HTML5+CSS+JQuery 实现简单的进度条功能
  6. 【华为云技术分享】基于ModelArts AI市场算法MobileNet_v2实现花卉分类,支持CPU、GPU、Ascend推理
  7. 新一批国产游戏版号下发:共53款 腾讯、网易在列
  8. 使用swagger作为restful api的doc文档生成
  9. VMware Workstation 常见问题解决
  10. mac android 找不到设备管理器,Android Studio找不到连接设备解决方案
  11. Postfix上的反垃圾邮件的四个方法
  12. yolov2 - tiny模型训练识别
  13. 外卖分销分佣小程序外卖cps小程序返利系统源码分享
  14. matlab的GUI怎么嵌入图片,如何用matlab在GUI中显示一张图片
  15. 华为平行视界(应用内分屏)
  16. docker+robot framework+selenium并发web应用UI自动化测试实践
  17. SpringBoot接入支付宝沙箱返回支付二维码
  18. strawberry perl环境安装介绍
  19. 深入浅出正则表达式(一)(zzl)
  20. javaweb开发和j2ee区别

热门文章

  1. 微信小程序生命周期笔记
  2. Lookahead、LazyOptimizer、MaskedAdamOptimizer、AdaBound
  3. 【Linux】Linux input子系统之Input event codes
  4. 108个Python精选库,看完收获丰富
  5. 【观察】戴尔科技+VMware:多云演进,步步为“赢”
  6. ​华为麒麟1020首曝光;全球首款 5G 扩展现实平台发布;英特尔将开拓“全硅”市场;京东周伯文掌舵,申元庆出局……...
  7. 关于视觉SLAM的最先进技术的调查-A survey of state-of-the-art on visual SLAM
  8. 计算捐款总量 (10 分)
  9. ffmpeg实战教程(五)libswscale,libavfilter实践指南
  10. 弘扬中华传统文化 讲好中国故事