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 相关文章推荐
Javascript中的数学函数
Apr 04 Javascript
[原创]js获取数组任意个不重复的随机数组元素
Mar 15 Javascript
使用js修改客户端注册表的方法
Aug 09 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
Aug 19 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
May 11 Javascript
JQ技术实现注册页面带有校验密码强度
Jul 27 Javascript
javascript实现粘贴qq截图功能(clipboardData)
May 29 Javascript
js 调用百度分享功能
Feb 27 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
Sep 30 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
Mar 02 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
Jul 13 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
Feb 21 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中使用与Perl兼容的正则表达式
2006/11/26 PHP
php header功能的使用
2013/10/28 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
浅析jQuery对select操作小结(遍历option,操作option)
2013/07/04 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
Python编写生成验证码的脚本的教程
2015/05/04 Python
Python通过OpenCV的findContours获取轮廓并切割实例
2018/01/05 Python
Python requests设置代理的方法步骤
2020/02/23 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
花卉与景观设计系大学生求职信
2013/10/01 职场文书
施工安全协议书
2013/12/11 职场文书
防灾减灾活动总结
2014/08/30 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
执行力心得体会范文
2016/01/11 职场文书
简单聊聊Golang中defer预计算参数
2022/03/25 Golang
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js