vue 实现剪裁图片并上传服务器功能


Posted in Javascript onMarch 01, 2018

预览链接点击预览

效果图如下所示,大家感觉不错,请参考实现代码。

vue 实现剪裁图片并上传服务器功能 

需求

  • [x] 预览:根据选择图像大小自适应填充左侧裁剪区域
  • [x] 裁剪:移动裁剪框右侧预览区域可实时预览
  • [x] 上传&清空:点击确认上传裁剪图片,点击取消按钮清空图像
  • [ ] 裁剪框可调节大小

实现步骤

methods:funName() - 对应源码中methods中的funName方法

data:dataName - 对应源码中data中的dataName数据

1. 图片选择与读取

  • 选择图片 :(methods:selectPic) 使用 input[type="file"] 弹出选择图片框,js 主动触发点击事件;
  • 读取图片 : (methods:readImage) 创建图片对象,使用createObjectURL显示图片。 objectURL = URL.createObjectURL(blob) ;

2. 在canvas中展示图片

需要掌握的 canvas 相关知识:

  1. 清空画布 ctx.clearRect(x,y,width,height) ;
  2. 填充矩形 ctx.fillRect(x,y,width,height) ;
  3. 绘制圆弧 ctx.arc(x,y,r,startAngle,endAngle,counterclockwise) ; 绘制矩形 ctx.rect(x,y,width,height);
  4. 绘制图像drawImage

vue 实现剪裁图片并上传服务器功能 

# 语法
 ctx.drawImage(image, dx, dy);
 ctx.drawImage(image, dx, dy, dWidth, dHeight);
 ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
 # 参数
 image    # 绘制的元素(可以为HTMLImageElement,HTMLVideoElement,或者 HTMLCanvasElement。)
 dx,dy    # 目标画布(destination canvas)左上角的坐标
 dWidth,dHeight  # 目标画布(destination canvas)上绘制图像宽高
 sx,sy    # 源画布(source canvase)左上角的坐标
 sWidth,sHeight  # 源画布(source canvase)选择的图像宽高

5.剪裁图片 ctx.clip() ;

具体步骤:

  • 计算canvas宽高 :(methods:calcCropperSize) 根据图片大小,计算canvas宽高(data:cropperCanvasSize),以致图片能够在裁剪区域自适应展示,并确定裁剪的左上角位置(data:cropperLocation)。
  • 绘制左侧裁剪区域图像 :(methods:renderCropperImg)

裁剪区域vue data示意图:

vue 实现剪裁图片并上传服务器功能 

  • 绘制右侧预览图片 :(methods:renderPreviewImg)

3. 移动裁剪框

知识点: onmousedown、onmousemove、onmouseup

具体实现:

methods:drag()

记录鼠标坐标,鼠标移动根据偏移量计算圆心位置。

canvas.onmousedown = e => {
  let [lastX, lastY] = [e.offsetX, e.offsetY];
  self.movement = true;
  canvas.onmousemove = e => {
   self.circleCenter = {
   X:
    self.cropperCanvasSize.width > 2 * self.slectRadius
    ? self.circleCenter.X + (e.offsetX - lastX)
    : self.cropperCanvasSize.width / 2,
   Y:
    self.cropperCanvasSize.height > 2 * self.slectRadius
    ? self.circleCenter.Y + (e.offsetY - lastY)
    : self.cropperCanvasSize.height / 2
   };
   self.renderCropperImg();
   [lastX, lastY] = [e.offsetX, e.offsetY];
  };
  canvas.onmouseup = e => {
   self.movement = false;
   canvas.onmousemove = null;
   canvas.onmouseup = null;
  };
  };

4. 上传图片至服务器

知识点:

  • FormData 对象的使用
  • canvas.toBlob() ;
  • Convert Data URI to File then append to FormData

具体实现:

methods:upload()
this.$refs.preview.toBlob((blob)=> {
  const url = URL.createObjectURL(blob);
  const formData = new FormData();
  formData.append(this.uploadProps.name, blob, `${Date.now()}.png`);
  if(this.data){
   Object.keys(this.uploadProps.data).forEach(key => {
    formData.append(key, this.uploadProps.data[key]);
   });
  }
  const request = new XMLHttpRequest();
  request.open("POST", this.uploadProps.action, true);
  request.send(formData);
  request.onreadystatechange = () => {
   if (request.readyState === 4 && request.status === 200) {
    // ...
   }
  };
  });

总结

以上所述是小编给大家介绍的vue 实现剪裁图片并上传服务器功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
预加载css或javascript的js代码
Apr 23 Javascript
jquery无缝向上滚动实现代码
Mar 29 Javascript
JavaScript中的toUTCString()方法使用详解
Jun 12 Javascript
js实现固定显示区域内自动缩放图片的方法
Jul 18 Javascript
Bootstrap表单Form全面解析
Jun 13 Javascript
利用jQuery实现打字机字幕效果实例代码
Sep 02 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
Jul 04 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
Aug 08 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
Mar 19 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
Oct 18 Javascript
JS字典Dictionary类定义与用法示例
Feb 01 Javascript
JavaScript canvas仿代码流瀑布
Feb 10 Javascript
解决easyui日期时间框ie的兼容的问题
Mar 01 #Javascript
详解Immutable及 React 中实践
Mar 01 #Javascript
解决VUEX兼容IE上的报错问题
Mar 01 #Javascript
Node.js readline 逐行读取、写入文件内容的示例
Mar 01 #Javascript
基于Vuex无法观察到值变化的解决方法
Mar 01 #Javascript
Node.js readline模块与util模块的使用
Mar 01 #Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
Mar 01 #Javascript
You might like
php结合正则获取字符串中数字
2015/06/19 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
Prototype使用指南之selector.js
2007/01/10 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
jquery中validate与form插件提交的方式小结
2016/03/26 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
JS作用域深度解析
2016/12/29 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
Python学习入门之区块链详解
2017/07/25 Python
基于Python os模块常用命令介绍
2017/11/03 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
pycharm创建一个python包方法图解
2019/04/10 Python
利用python求积分的实例
2019/07/03 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
4s店机修工岗位职责
2013/12/20 职场文书
贷款委托书
2014/08/01 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
毕业典礼致辞
2015/07/29 职场文书
品德与社会教学反思
2016/02/24 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
MySQL查询学习之基础查询操作
2021/05/08 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL