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 相关文章推荐
Track Image Loading效果代码分析
Aug 13 Javascript
jQuery 使用手册(三)
Sep 23 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
Feb 07 Javascript
JavaScript等比例缩放图片控制超出范围的图片
Aug 06 Javascript
框架页面高度自动刷新的Javascript脚本
Nov 01 Javascript
JS版的date函数(和PHP的date函数一样)
May 12 Javascript
有关Promises异步问题详解
Nov 13 Javascript
jquery实现移动端点击图片查看大图特效
Sep 11 Javascript
js实现根据身份证号自动生成出生日期
Dec 15 Javascript
浅析Vue 生命周期
Jun 21 Javascript
详解项目升级到vue-cli3的正确姿势
Jan 28 Javascript
微信小程序实现的五星评价功能示例
Apr 25 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 修改zen-cart下单和付款流程以防止漏单
2010/03/08 PHP
php统计文章排行示例
2014/03/04 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
深入解读Python解析XML的几种方式
2016/02/16 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
python reduce 函数使用详解
2017/12/05 Python
python3实现逐字输出的方法
2019/01/23 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
python和php哪个容易学
2020/06/19 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
任意存:BOXFUL
2018/05/21 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
YII2 全局异常处理深入讲解
2021/03/24 PHP
学校标语大全
2014/06/19 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
万里长城导游词
2015/01/30 职场文书
防暑降温通知书
2015/04/27 职场文书
信访维稳承诺书
2015/05/04 职场文书
MySQL 5.7常见数据类型
2021/07/15 MySQL
Vue如何清空对象
2022/03/03 Vue.js
Win11开始菜单添加休眠选项
2022/04/19 数码科技