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 相关文章推荐
js玩一玩WSH吧
Feb 23 Javascript
javascript 精粹笔记
May 09 Javascript
客户端限制只能上传jpg格式图片的js代码
Dec 09 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
Dec 16 Javascript
jQuery 选择器详解
Jan 19 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
Sep 15 Javascript
js省市联动效果完整实例代码
Dec 09 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
Jul 08 Javascript
js实现手机拍照上传功能
Jan 17 Javascript
记录一篇关于redux-saga的基本使用过程
Aug 18 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
May 15 Javascript
vue在路由中验证token是否存在的简单实现
Nov 11 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
php设计模式 Delegation(委托模式)
2011/06/26 PHP
Yii CGridView用法实例详解
2016/07/12 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
一个基于jquery的文本框记数器
2012/09/19 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
微信小程序App生命周期详解
2018/01/31 Javascript
JS模拟实现哈希表及应用详解
2018/05/04 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
jQuery使用hide()、toggle()函数实现相机品牌展示隐藏功能
2021/01/29 jQuery
python使用marshal模块序列化实例
2014/09/25 Python
你真的了解Python的random模块吗?
2017/12/12 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
基于Python实现用户管理系统
2019/02/26 Python
python读写配置文件操作示例
2019/07/03 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
高三自我鉴定范文
2013/10/19 职场文书
军训自我鉴定怎么写
2014/02/13 职场文书
家长对学生的评语
2014/04/18 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
迎国庆演讲稿
2014/09/05 职场文书
骨干教师申报材料
2014/12/17 职场文书
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js