js插件Jcrop自定义截取图片功能


Posted in Javascript onOctober 14, 2016

当初说这个需求的时候,在网上找了一点资料,但是基本上感觉不符合项目中的需求。参照一些项目,和同事的改造,终于是像点样子了。

截图大致截为3个像素,每个像素使用的地方也不同,考虑图片不会是很多,分别压缩保存下来。

根据截取的像素位置,对应的压缩成相应的图片:

js插件Jcrop自定义截取图片功能 

首先需要下载Jcrop.js与uploadify.js 上传图片的插件和截图的插件

Comm_UploadJcrop.js

//剪裁头像对象和宽高比例
var jcrop_api, boundx, boundy;
//上传图片 
//Id:上传控件Id
//IsShowProgress:是否需要展示进度条
//SuccessFunc: 上传成功执行的方法
function UploadImg(Id, IsShowProgress, SuccessFunc,IsJcrop) {
 var uploadObj = $("#" + Id);
 var htmlstr = "<div class='upload_ShowFileProgress' id='" + Id + "-queue' " + (IsShowProgress ? "" : "style='display:none;'") + "></div>";
 uploadObj.parent().append(htmlstr);
 var img_UploadUrl = IsJcrop ? "/Upload/UploadifyHeader" : "/Upload/UploadifyImg"; //Upload控制器中方法
 uploadObj.uploadify({
  //指定swf文件
  'swf': '/Scripts/uploadify/uploadify.swf',//下载uploadify插件中的uploadify.swf
  //后台处理的页面
  'uploader': img_UploadUrl,
  //进度条id
  'queueID': Id + "-queue",
  //进度条显示完成后是否自动消失
  'removeCompleted': false,
  //按钮相关
  'buttonClass': 'btn_Upload',
  'buttonText': '请选择图片',
  'height': '31',
  'width': '108',
  //在浏览窗口底部的文件类型下拉菜单中显示的文本
  'fileTypeDesc': 'Image Files',
  //允许上传的文件后缀
  'fileTypeExts': '*.gif; *.jpg; *.png; *.bmp; *.jpeg; *.svg',
  //选择文件后自动上传
  'auto': true,
  //设置为true将允许多文件上传
  'multi': false,
  'onUploadSuccess': function (file, data, response) {
   if (SuccessFunc != undefined && SuccessFunc != null && SuccessFunc.length > 0) {
    eval(SuccessFunc + "(file,data,response)");
   }
  }
 });
}
//上传文件
//Id:上传控件Id
//IsShowProgress:是否需要展示进度条
//SuccessFunc: 上传成功执行的方法
function UploadFile(Id, IsShowProgress, SuccessFunc) {
 var uploadObj = $("#" + Id);
 var htmlstr = "<div class='upload_ShowFileProgress' id='" + Id + "-queue' " + (IsShowProgress ? "" : "style='display:none;'") + "></div>";
 uploadObj.parent().append(htmlstr);
 uploadObj.uploadify({
  //指定swf文件
  'swf': '/Scripts/uploadify/uploadify.swf',
  //后台处理的页面
  'uploader': '/Upload/Uploadify',
  //进度条id
  'queueID': Id + "-queue",
  //进度条显示完成后是否自动消失
  'removeCompleted': false,
  //按钮相关
  'buttonClass': 'btn_Upload',
  'buttonText': '请选择文件',
  'height': '31',
  'width': '108',
  //上传文件的类型 默认为所有文件
  'All Files': '*.*',
  //在浏览窗口底部的文件类型下拉菜单中显示的文本
  //'fileTypeDesc': 'Image Files',
  //允许上传的文件后缀
  'fileTypeExts': '*.*',
  //选择文件后自动上传
  'auto': false,
  //设置为true将允许多文件上传
  'multi': true,
  'onUploadSuccess': function (file, data, response) {
   if (SuccessFunc != undefined && SuccessFunc != null && SuccessFunc.length > 0) {
    eval(SuccessFunc + "(file,data,response)");
   }
  }
 });
}
//设定图片
function SetJcropImage(url) {
 $(".div_NoFileTip").hide();
 $(".UploadImgContainer").show();
 $("#preview_large").attr("src", url);
 $("#preview_large2").attr("src", url);
 $("#preview_large3").attr("src", url);
 $("#imgsrc").val(url);
 ErealizeJcrop(url);
}
//剪切图片
function ErealizeJcrop(url) {
 var $pcnt = $('#preview_large2').parent(),
  xsize = $pcnt.width(),
  ysize = $pcnt.height();
 $('#preview_large').Jcrop({
  onChange: updatePreview,
  onSelect: updatePreview,
  onSelect: updateCoords,
  aspectRatio: xsize / ysize
 }, function () {
  var bounds = this.getBounds();
  boundx = bounds[0];
  boundy = bounds[1];
  jcrop_api = this;
  // $preview.appendTo(jcrop_api.ui.holder);
 });
 //更换图片时重新加载图片
 if (jcrop_api != undefined)
  jcrop_api.setImage(url);
 function updateCoords(c) {
  $('#x').val(c.x);
  $('#y').val(c.y);
  $('#w').val(c.w);
  $('#h').val(c.h);
 };
 function updatePreview(c) {
  if (parseInt(c.w) > 0) {
   var rx = xsize / c.w;
   var ry = ysize / c.h;

   $("#preview_large2").css({
    width: Math.round(rx * boundx) + 'px',
    height: Math.round(ry * boundy) + 'px',
    marginLeft: '-' + Math.round(rx * c.x) + 'px',
    marginTop: '-' + Math.round(ry * c.y) + 'px'
   });

   $pcnt = $('#preview_large3').parent(),
   xsize2 = $pcnt.height();
   ysize2 = $pcnt.height();
   var rx2 = xsize2 / c.w;
   var ry2 = ysize2 / c.h;

   $("#preview_large3").css({
    width: Math.round(rx2 * boundx) + 'px',
    height: Math.round(ry2 * boundy) + 'px',
    marginLeft: '-' + Math.round(rx2 * c.x) + 'px',
    marginTop: '-' + Math.round(ry2 * c.y) + 'px'
   });

  }
 };

 后台代码: 

#region 判断文件夹是否存在,不存在则创建,返回文件夹路径
  private void CheckFileExistsCreateNew(string filepath)
  {
   if (!Directory.Exists(Server.MapPath(filepath)))
   {
    Directory.CreateDirectory(Server.MapPath(filepath));//创建文件夹
   }
  }
  #endregion

  #region 上传图片

  //上传头像
  [HttpPost]
  public JsonResult UploadifyHeader(HttpPostedFileBase fileData)
  {
   if (fileData != null)
   {
    try
    {
     // 文件上传后的保存路径

     string fileName = Path.GetFileName(fileData.FileName);// 原始文件名称
     string fileExtension = Path.GetExtension(fileName); // 文件扩展名
     string saveName =DateTime.Now.ToString("yyyyMMddHHmmssffff")+"_Y" + fileExtension; // 保存文件名称 
     string Url = "/Upload/" + CurrentUserInfo.Sys_RentCompany.CompanyKey + "/" + CurrentUserInfo.Comm_User.Id + "/UploadImg"; //在项目中创建一个Upload文件夹存放上传和截取的图片 CurrentUserInfo.Sys_RentCompany.CompanyKey 为session 保存的值 这里对应的文件夹的路径 自己可以定义
     string ShowUrl = Url + "/" + saveName;
     string filePhysicalPath = Server.MapPath(ShowUrl);
     //当前登陆人文件夹
     CheckFileExistsCreateNew(Url);

     fileData.SaveAs(filePhysicalPath);

     //压缩图片
     string YsFileImg = ImgHandler.YsImg(ShowUrl, filePhysicalPath);

     return Json(YsFileImg);
    }
    catch (Exception ex)
    {
     return Json(new { Success = false, Message = ex.Message }, JsonRequestBehavior.AllowGet);
    }
   }
   else
   {
    return Json(new { Success = false, Message = "请选择要上传的文件!" }, JsonRequestBehavior.AllowGet);
   }
  }

  //上传头像
  [HttpPost]
  public JsonResult UploadifyImg(HttpPostedFileBase fileData)
  {
   if (fileData != null)
   {
    try
    {
     // 文件上传后的保存路径

     string fileName = Path.GetFileName(fileData.FileName);// 原始文件名称
     string fileExtension = Path.GetExtension(fileName); // 文件扩展名
     string saveName = DateTime.Now.ToString("yyyyMMddHHmmssffff") + "_Y" + fileExtension; // 保存文件名称 
     //string filed = "/Upload/" + saveName;//路经
     string Url = "/Upload/" + CurrentUserInfo.Sys_RentCompany.CompanyKey + "/" + CurrentUserInfo.Comm_User.Id + "/UploadImg";
     string ShowUrl = Url + "/" + saveName;
     string filePhysicalPath = Server.MapPath(ShowUrl);
     //当前登陆人文件夹
     CheckFileExistsCreateNew(Url);

     fileData.SaveAs(filePhysicalPath);

     return Json(ShowUrl);
    }
    catch (Exception ex)
    {
     return Json(new { Success = false, Message = ex.Message }, JsonRequestBehavior.AllowGet);
    }
   }
   else
   {
    return Json(new { Success = false, Message = "请选择要上传的文件!" }, JsonRequestBehavior.AllowGet);
   }
  }

  //保存剪切的图片
  [HttpPost]
  public JsonResult JcropImg(FormCollection colls)
  {
   JsonFormatResult result = new JsonFormatResult { IsSuccess = true, Message = "保存成功!" };
   try
   {
    int x = int.Parse(colls["x"]);
    int y = int.Parse(colls["y"]);
    int w = int.Parse(colls["w"]);
    int h = int.Parse(colls["h"]);
    string imgsrc = colls["imgsrc"];
    string Path = ImgHandler.CutAvatar(imgsrc, x, y, w, h);
    result.Data = Path;
   }
   catch (Exception e)
   {
    result.IsSuccess = false;
    result.Message = e.Message;
   }
   return Json(result);
  } 
  #endregion

照搬的代码肯定会有缺陷,可以根据需求修改成适合的项目。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jqplot通过ajax动态画折线图的方法及思路
Dec 08 Javascript
jQuery取得设置清空select选择的文本与值
Jul 08 Javascript
AngularJS  自定义指令详解及实例代码
Sep 14 Javascript
详解vue父子模版嵌套案例
Mar 04 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
JavaScript实现简单的四则运算计算器完整实例
Apr 28 Javascript
VsCode新建VueJs项目的详细步骤
Sep 23 Javascript
React-intl 实现多语言的示例代码
Nov 03 Javascript
Node.js readline 逐行读取、写入文件内容的示例
Mar 01 Javascript
微信小程序dom操作的替代思路实例分析
Dec 06 Javascript
微信小程序缓存支持二次开发封装实现解析
Dec 16 Javascript
解决vue-router 嵌套路由没反应的问题
Sep 22 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
Oct 14 #Javascript
Js动态设置rem来实现移动端字体的自适应代码
Oct 14 #Javascript
JS动态计算移动端rem的解决方案
Oct 14 #Javascript
javascript对浅拷贝和深拷贝的详解
Oct 14 #Javascript
jQuery web 组件 后台日历价格、库存设置的代码
Oct 14 #Javascript
第一次接触神奇的Bootstrap
Oct 14 #Javascript
js仿手机页面文件下拉刷新效果
Oct 14 #Javascript
You might like
PHP中Session的概念
2006/10/09 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
jquery 分页控件实现代码
2009/11/30 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
javascript页面倒计时实例
2015/07/25 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
2016/12/06 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
express启用https使用小记
2019/05/21 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
Python缩进和冒号详解
2016/06/01 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
南京软件公司的.net程序员笔试题
2014/08/31 面试题
办公室保洁员岗位职责
2013/12/02 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
考试没考好检讨书
2014/01/31 职场文书
大课间体育活动方案
2014/03/12 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
捐款活动总结
2014/08/27 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
奖励通知
2015/04/22 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书