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-Mozilla和IE中的一个函数直接量的问题
Jan 09 Javascript
ExtJs 表单提交登陆实现代码
Aug 19 Javascript
jquery得到iframe src属性值的方法
Sep 25 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
Aug 05 Javascript
纯javascript实现分页(两种方法)
Aug 26 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
Jan 01 Javascript
JS函数的定义与调用方法推荐
May 12 Javascript
微信小程序 简单教程实例详解
Jan 13 Javascript
js实现登录框鼠标拖拽效果
Mar 09 Javascript
基于Vue实例对象的数据选项
Aug 09 Javascript
Vuex 使用及简单实例(计数器)
Aug 29 Javascript
jQuery treeview树形结构应用
Mar 24 jQuery
解决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
ThinkPHP文件上传实例教程
2014/08/22 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
GRID拖拽行的实例代码
2013/07/18 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
JavaScript DOM操作表格及样式
2015/04/13 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
vue 项目常用加载器及配置详解
2018/01/22 Javascript
Vue.directive()的用法和实例详解
2018/03/04 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
Python实现八大排序算法
2016/08/13 Python
Django实现自定义404,500页面教程
2017/03/26 Python
Python学习思维导图(必看篇)
2017/06/26 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
Python中生成ndarray实例讲解
2021/02/22 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
台湾百利市购物中心:e-Payless
2017/08/16 全球购物
水果超市创业计划书
2014/01/27 职场文书
考试诚信承诺书
2014/05/23 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
2014教师年度工作总结
2014/11/10 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
观后感开头
2015/06/19 职场文书
安全守法证明
2015/06/23 职场文书
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技