cropper js基于vue的图片裁剪上传功能的实现代码


Posted in Javascript onMarch 01, 2018

前些日子做了一个项目关于vue项目需要头像裁剪上传功能,看了一篇文章,在此基础上做的修改完成了这个功能,与大家分享一下。原文:https://3water.com/article/135719.htm

首先下载引入cropper js,

npm install cropper js --save

在需要的页面引入:import Cropper from "cropper js"

html的代码如下:

<template> 
 <div id="demo"> 
 <!-- 遮罩层 --> 
 <div class="container" v-show="panel"> 
 <div> 
  <img id="image" :src="url" alt="Picture"> 
 </div> 
 <button type="button" id="button" @click="commit">确定</button> 
 <button type="button"id="cancel" @click="cancel">取消</button> 
 </div> 
 <div style="padding:20px;"> 
 <div class="show"> 
  <div class="picture" :style="'backgroundImage:url('+headerImage+')'"> 
  </div> 
 </div> 
 <div style="margin-top:20px;text-align: left;"> 
  <input type="file" id="change" accept="image" @change="change"> 
  <label for="change"></label> 
 </div> 
 </div> 
 </div> 
</template>

主要是js代码,如下

1,data里面定好初始变量,绑定数据,imgCropperData是我定义的判断图片格式的。

data() { 
 return { 
 headerImage: "", 
 picValue: "", 
 cropper: "", 
 croppable: false, 
 panel: false, 
 url: "", 
 imgCropperData: { 
 accept: "image/gif, image/jpeg, image/png, image/jpg" 
 } 
 }; 
 }

2,在mounted里面初始换裁剪框

mounted() { 
 //初始化这个裁剪框 
 var self = this; 
 var image = document.getElementById("image"); 
 this.cropper = new Cropper(image, { 
 aspectRatio: 1, 
 viewMode: 1, 
 background: false, 
 zoomable: false, 
 ready: function() { 
 self.croppable = true; 
 } 
 }); 
 }

3.methods的方法比较多,包括创建URL路径,input框change事件,canvas画图,确定提交上传。我还加了取消事件函数,判断上传文件的类型和大小。

methods: { 
 //取消上传 
 cancel() { 
 this.panel = false; 
 var obj = document.getElementById('change') ; 
 obj.outerHTML=obj.outerHTML; 
 }, 
 //创建url路径 
 getObjectURL(file) { 
 var url = null; 
 if (window.createObjectURL != undefined) { 
 // basic 
 url = window.createObjectURL(file); 
 } else if (window.URL != undefined) { 
 // mozilla(firefox) 
 url = window.URL.createObjectURL(file); 
 } else if (window.webkitURL != undefined) { 
 // webkit or chrome 
 url = window.webkitURL.createObjectURL(file); 
 } 
 return url; 
 }, 
 //input框change事件,获取到上传的文件 
 change(e) { 
 let files = e.target.files || e.dataTransfer.files; 
 if (!files.length) return; 
 let type = files[0].type; //文件的类型,判断是否是图片 
 let size = files[0].size; //文件的大小,判断图片的大小 
 if (this.imgCropperData.accept.indexOf(type) == -1) { 
 alert("请选择我们支持的图片格式!"); 
 return false; 
 } 
 if (size > 5242880) { 
 alert("请选择5M以内的图片!"); 
 return false; 
 } 
 this.picValue = files[0]; 
 this.url = this.getObjectURL(this.picValue); 
 //每次替换图片要重新得到新的url 
 if (this.cropper) { 
 this.cropper.replace(this.url); 
 } 
 this.panel = true; 
 }, 
 //确定提交 
 commit() { 
 this.panel = false; 
 var croppedCanvas; 
 var roundedCanvas; 
 if (!this.croppable) { 
 return; 
 } 
 // Crop 
 croppedCanvas = this.cropper.getCroppedCanvas(); 
 // Round 
 roundedCanvas = this.getRoundedCanvas(croppedCanvas); 
 this.headerImage = roundedCanvas.toDataURL(); 
 //上传图片 
 this.postImg(); 
 }, 
 //canvas画图 
 getRoundedCanvas(sourceCanvas) { 
 var canvas = document.createElement("canvas"); 
 var context = canvas.getContext("2d"); 
 var width = sourceCanvas.width; 
 var height = sourceCanvas.height; 
 canvas.width = width; 
 canvas.height = height; 
 context.imageSmoothingEnabled = true; 
 context.drawImage(sourceCanvas, 0, 0, width, height); 
 context.globalCompositeOperation = "destination-in"; 
 context.beginPath(); 
 context.arc( 
 width / 2, 
 height / 2, 
 Math.min(width, height) / 2, 
 0, 
 2 * Math.PI, 
 true 
 ); 
 context.fill(); 
 return canvas; 
 }, 
 //提交上传函数 
 postImg() { 
 alert("上传成功"); 
 //这边写图片的上传 
 } 
 }

css样式代码就不贴出来了,可以到GitHub上下载https://github.com/leileibrother/cropper-js-vue-。

总结

以上所述是小编给大家介绍的cropper js基于vue的图片裁剪上传功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
在视频前插入广告
Nov 20 Javascript
javascript iframe内的函数调用实现方法
Jul 19 Javascript
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
Mar 16 Javascript
javascript new fun的执行过程
Aug 05 Javascript
jquery实现控制表格行高亮实例
Jun 05 Javascript
jQuery取得设置清空select选择的文本与值
Jul 08 Javascript
浅析JavaScript事件和方法
Feb 28 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
Oct 19 Javascript
Vue中的v-for循环key属性注意事项小结
Aug 12 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
Jan 06 Javascript
基于vue-cli3创建libs库的实现方法
Dec 04 Javascript
Javascript前端下载后台传来的文件流代码实例
Aug 18 Javascript
Vuex中mutations与actions的区别详解
Mar 01 #Javascript
vue 实现剪裁图片并上传服务器功能
Mar 01 #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
You might like
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
URL Rewrite的设置方法
2007/01/02 PHP
php表单提交问题的解决方法
2011/04/12 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
PHP递归创建多级目录
2015/11/05 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
如何防止INPUT按回车自动提交表单FORM
2016/12/06 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
js实现一键复制功能
2017/03/16 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
js+html获取系统当前时间
2017/11/10 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
[06:43]2018DOTA2国际邀请赛寻真——VGJ.Thunder
2018/08/11 DOTA
python 正则式 概述及常用字符
2009/05/07 Python
Python中使用SAX解析xml实例
2014/11/21 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
Python部署web开发程序的几种方法
2017/05/05 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
详解python中init方法和随机数方法
2019/03/13 Python
keras 多任务多loss实例
2020/06/22 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
Python里面search()和match()的区别
2016/09/21 面试题
Java面试笔试题大全
2016/11/23 面试题
建房协议书
2014/04/11 职场文书
公司董事长岗位职责
2014/06/08 职场文书
英语系本科生求职信
2014/07/15 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
python munch库的使用解析
2021/05/25 Python
python如何为list实现find方法
2022/05/30 Python