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 相关文章推荐
JQuery下的Live方法和$.browser方法使用代码
Jun 02 Javascript
jquery tab插件制作实现代码
Jun 22 Javascript
jquery使用ul模拟select实现表单美化的方法
Aug 18 Javascript
javascript中不易分清的slice,splice和split三个函数
Mar 29 Javascript
JavaScript继承学习笔记【新手必看】
May 10 Javascript
Vue.js教程之计算属性
Nov 11 Javascript
Avalonjs 实现简单购物车功能(实例代码)
Feb 07 Javascript
js实现轮播图的完整代码
Oct 26 Javascript
解决百度Echarts图表坐标轴越界的方法
Oct 17 Javascript
JavaScript设计模式之代理模式实例分析
Jan 16 Javascript
JavaScript中的事件与异常捕获详析
Feb 24 Javascript
js实现表格单列按字母排序
Aug 12 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中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
php之XML转数组函数的详解
2013/06/07 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
jquery禁用右键示例
2014/04/28 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
js实现网页抽奖实例
2015/08/05 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
Python多进程编程技术实例分析
2014/09/16 Python
一些Python中的二维数组的操作方法
2015/05/02 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
利用numpy+matplotlib绘图的基本操作教程
2017/05/03 Python
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
python 系统调用的实例详解
2017/07/11 Python
Python 实现一行输入多个值的方法
2018/04/21 Python
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
EJB的角色和三个对象
2015/12/31 面试题
运动会开幕式邀请函
2014/02/03 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
个人求职意向书
2015/05/11 职场文书
2016庆祝教师节新闻稿
2015/11/25 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python
vue实现列表垂直无缝滚动
2022/04/08 Vue.js
详解MongoDB排序时内存大小限制与创建索引的注意事项
2022/05/06 MongoDB