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 相关文章推荐
js中根据字数截取字符串,不能截断url
Jan 12 Javascript
说说JSON和JSONP 也许你会豁然开朗
Sep 02 Javascript
table insertRow、deleteRow定义和用法总结
May 14 Javascript
jQueryMobile之Helloworld与页面切换的方法
Feb 04 Javascript
JS控制网页动态生成任意行列数表格的方法
Mar 09 Javascript
js实现鼠标点击文本框自动选中内容的方法
Aug 20 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
Jan 04 Javascript
提高Node.js性能的应用技巧分享
Aug 10 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
Aug 30 Javascript
React如何利用相对于根目录进行引用组件详解
Oct 09 Javascript
axios取消请求的实践记录分享
Sep 26 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 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
php一个文件搞定微信jssdk配置
2016/12/12 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
js中判断控件是否存在
2010/08/25 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
js无刷新操作table的行和列
2014/03/27 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
python实现定制交互式命令行的方法
2014/07/03 Python
Python Deque 模块使用详解
2014/07/04 Python
Python字典操作简明总结
2015/04/13 Python
python中私有函数调用方法解密
2016/04/29 Python
Python中str.format()详解
2017/03/12 Python
python生成九宫格图片
2018/11/19 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
Django继承自带user表并重写的例子
2019/11/18 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
阿迪达斯丹麦官网:adidas丹麦
2016/10/01 全球购物
英语专业推荐信
2013/11/16 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
安全横幅标语
2014/06/09 职场文书
物业消防安全责任书
2014/07/23 职场文书
创先争优个人承诺书
2014/08/30 职场文书
汽车销售助理岗位职责
2015/04/14 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
SpringDataJPA在Entity中常用的注解介绍
2021/12/06 Java/Android
MSSQL基本语法操作
2022/04/11 SQL Server