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 相关文章推荐
利用div+jquery自定义滚动条样式的2种方法
Jul 18 Javascript
AngularGauge 属性解析详解
Sep 06 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
Jan 17 Javascript
Vue2 轮播图slide组件实例代码
May 31 Javascript
JS实现判断图片是否加载完成的方法分析
Jul 31 Javascript
微信小程序日历/日期选择插件使用方法详解
Dec 28 Javascript
vue项目移动端实现ip输入框问题
Mar 19 Javascript
vue生命周期的探索
Apr 03 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
Jul 19 Javascript
JavaScript实现打砖块游戏
Feb 25 Javascript
vue 函数调用加括号与不加括号的区别
Oct 29 Javascript
js实现简单的倒计时
Jan 28 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安装攻略:常见问题解答(一)
2006/10/09 PHP
一个简单实现多条件查询的例子
2006/10/09 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
7个有用的jQuery代码片段分享
2015/05/19 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
值得分享的Bootstrap Table使用教程
2016/11/23 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
vue实现日历备忘录功能
2020/09/24 Javascript
python访问纯真IP数据库的代码
2011/05/19 Python
Python类的专用方法实例分析
2015/01/09 Python
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
土木工程专业大学毕业生求职信
2013/10/13 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
中队活动总结
2014/08/27 职场文书
优秀教师先进材料
2014/12/16 职场文书
美丽心灵观后感
2015/06/01 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript