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 append() html时的小问题的解决方法
Dec 16 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
Apr 16 Javascript
Jquery 数组操作大全个人总结
Nov 13 Javascript
js获取域名的方法
Jan 27 Javascript
jquery实现下拉框功能效果【实例代码】
May 06 Javascript
jquery实现简单的瀑布流布局
Dec 11 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
Mar 27 Javascript
BootStrap 动态表单效果
Jun 02 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
Jul 17 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
Aug 07 Javascript
Vue将props值实时传递 并可修改的操作
Aug 09 Javascript
让Vue响应Map或Set的变化操作
Nov 11 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/03/12 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
详解php框架Yaf路由重写
2017/06/20 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
详解JavaScript函数
2015/12/01 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
JavaScript使用ZeroClipboard操作剪切板
2017/05/10 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
jQuery length 和 size()区别总结
2018/04/26 jQuery
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
2021/01/13 Vue.js
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
在交互式环境中执行Python程序过程详解
2019/07/12 Python
python 实现线程之间的通信示例
2020/02/14 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
李维斯牛仔裤英国官方网站:Levi’s英国
2019/10/10 全球购物
付款委托书范本
2014/04/04 职场文书
身边的榜样活动方案
2014/08/20 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
费城故事观后感
2015/06/10 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
MySQL中的隐藏列的具体查看
2021/09/04 MySQL
使用HttpSessionListener监听器实战
2022/03/17 Java/Android