热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用cropper插件的头像裁剪功能获取base64图片压缩

,头像裁剪裁剪功能做了大概有五天,效率太低了,有时候遇到问题不知道该怎么下手,在此非常感谢同事的耐心指导,下面

,头像裁剪裁剪功能做了大概有五天,效率太低了,有时候遇到问题不知道该怎么下手,在此非常感谢同事的耐心指导,下面是基于cropper插件做的头像裁剪的功能,里面使用到了如何获取base64,以及图片压缩处理

cropperjs插件

cropper使用文档
插件的安装及使用方法文档里面都有详细的说明

安装:

npm install cropperjs

使用

在参考文档的基础上,想要实现的功能是:点击上传图片,上传后跳转到模态框,进行裁剪。这里会有一个图片大小的问题,裁剪后的图片在保存时会扩大2倍,所以要做一个压缩处理

上传图片

photo.vue
1.设置一个img



//点击上传照片

上传照片



//必须给图片设置宽高
img{max-width: 100%;max-height: 100%;}

2.图片从状态管理中获取

computed: {...mapGetters({'getUrl': 'getUrl'}),imgUrl() {if (this.getUrl.url && this.getUrl.url.startsWith('http')) {return this.getUrl.url}//返回默认图片return defaultPhoto}}

如何获取图片的base64

3.图片上传方法

methods: {...mapActions(['setModelBaseInfo', 'setPhotoUploadComponent']),/*** 上传图片* @param event*/handlerChange(event) {let file = event.target.files[0]if (!file) {return}let type = file.type || ''if ((type !== "image/jpeg" && type !== "image/png")) {alert('上传失败’)//置空event.target.value = nullreturn}let that = this// 获取并记录图片的base64编码let reads = new FileReader()// 读出base64reads.readAsDataURL(file)reads.onloadend = function() {var dataURL = reads.result// 跳转到模态框进行裁剪that.UploadComponent(dataURL)event.target.value = null}}},

模态框处理

modal.vue
1.模态框template

//点击保存时 图片需要一定时间保存,所以加一个loading保存保存中



2.引入cropper插件

import 'cropperjs/dist/cropper.css'
import Cropper from 'cropperjs'

3.设置cropper的opptions属性

//使用过程中多处会调用cropper,所以直接写在data里面 方便调用
data() {return {cropper: ''}},mounted() {this.init()},
methods: {
//写一个方法,便于调用init() {//图片存在的情况下执行裁剪操作if (this.$refs.img) {this.cropper = new Cropper(this.$refs.img, {//此处为options属性,可根据实际需求改变aspectRatio: 3 / 4,autoCropArea: 0.75,viewMode: 2,background: false,rounded: true})}}}

base64去前缀

fitler(base) {let str = 'base64,'return base.slice(base.indexOf(str) + str.length)}

获取base64大小

getBase64Size(base64) {let eqTagIndex = base64.indexOf("=")base64 = eqTagIndex != -1 ? base64.substring(0, eqTagIndex) : base64let strLen = base64.lengthreturn strLen - (strLen / 8) * 2}

压缩图片

scaleImg(base64, percent, cb) {let _img = new Image()_img.src = base64_img.onload = function() {let _canvas = document.createElement("canvas")_canvas.setAttribute("width", this.width)_canvas.setAttribute("height", this.height)_canvas.getContext("2d").drawImage(this, 0, 0, this.width, this.height)let data = _canvas.toDataURL("image/jpeg", percent)cb(data)}

保存图片

modal.vue

//点击保存按钮
handleClick() {const croppedCanvas = this.cropper.getCroppedCanvas()const MAX_SIZE = 10 * 1024 * 1024let base64 = croppedCanvas.toDataURL() // 获取到裁剪的地址let size = this.getBase64Size(base64)if (size {this.clickUpload(data)})}},clickUpload(data) {//此处可以做提示条 正在上传alert('上传中’)//Upload 请求服务this.Upload({name: 'a.jpg',pic: this.filter(data)}).then(res => {if (res.result === 'ok') {this.updateUrlStore(res.data || '')alert('uploadsuccess')} else {alert('uploadfail')}}).catch(() => {alert('uploadfail')})},/*** 同步到store*/updateUrlStore(url) {this.setModal({...this.modal,url})//同步模态框this.setCurrentComponent()},

遇到的问题

1.图片第一次上传裁剪后,二次上传同一图片时无反应
图片第一次上传请求接口没有问题,第二次点击没有正常请求接口
原因是第一次上传成功时,触发的onchange事件,onchange事件会在内容改变且失去焦点时触发,而第二次上传的图片还是上一次的图片的话,就不会触发这个onchange事件,从而导致图片上传失败.
解决方案:每次上传之后,都把值清空,比如e.target.value = null属性和自带的方法

总结

首先,在阅读插件文档的时候,要弄明白它的使用规则,如何调用.我在前期花了很多时间在文档上,不太清楚如何使用插件自带的方法。其次,在实际开发过程中,会遇到很多的bug,多数与调取数据有关,以及对vue语法的使用的不熟悉,写好了方法,不知道该在哪里去调用。所以要更多地去熟悉vue!

资源参考

压缩base64
cropperjs
模态框


推荐阅读
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
author-avatar
骨感小男人2502861673_698
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有