vue-cropper 移动端上传图片压缩裁剪
头像裁剪压缩上传流程:
点击头像--判断是否为IOS端--若是--A,否则--B
A:选择图片 --C
B:弹框供用户选择从相册选择或者调用相机拍照--选择图片--C
C:出现cropper裁剪框,裁剪框位于图片上方,用户可以拖动或者放大缩小裁剪框--用户手动调整后--代码执行压缩并上传
1.引入vueCropper组件
地址:https://www.npmjs.com/package/vue-cropper/v/0.4.7
npm install vue-cropper --save-dev <script>
import { VueCropper } from 'vue-cropper'
export default {
name: 'UserProfile',
components: {
VueCropper
},
}
</script>
使用vue-cropper组件
<!-- 剪裁图片组件 -->
<van-popup
class="bg-tran"
v-model="showCropper"
closeable
position="top"
:style="{ height: '100%' }"
>
<div class="flex-column-center height100">
<vueCropper
ref="cropper"
:img="option.img"
:outputSize="option.outputSize"
:outputType="option.outputType"
:info="option.info"
:full="option.full"
:autoCropWidth="option.autoCropWidth"
:autoCropHeight="option.autoCropHeight"
:canMove="option.canMove"
:canMoveBox="option.canMoveBox"
:original="option.original"
:autoCrop="option.autoCrop"
:fixed="option.fixed"
:fixedNumber="option.fixedNumber"
:centerBox="option.centerBox"
:infoTrue="option.infoTrue"
:fixedBox="option.fixedBox"
:high="option.high"
:mode="option.mode"
></vueCropper>
<van-col span="24" class="font14 col-white">
<van-col span="8" class="p-2"><span @click="cancelCropper">取消</span></van-col>
<van-col span="8" class="p-2 text-center"><span @click="rotateImage" class="font18"><van-icon name="replay" /></span></van-col>
<van-col span="8" class="p-2 text-right"><span @click="getCropBlob">确定</span></van-col>
</van-col>
</div>
</van-popup>
vue-cropper配置:
<script>
export default {
data() {
return {
option: {
img: '',
outputSize: 0.8,
info: false, // 裁剪框的大小信息
outputType: 'jpeg', // 裁剪生成图片的格式
canScale: false, // 图片是否允许滚轮缩放
autoCrop: true, // 是否默认生成截图框
autoCropWidth: window.innerWidth - 100 + 'px', // 默认生成截图框宽度
autoCropHeight: window.innerWidth - 100 + 'px', // 默认生成截图框高度
high: true, // 是否按照设备的dpr 输出等比例图片
fixedBox: true, // 固定截图框大小 不允许改变
fixed: true, // 是否开启截图框宽高固定比例
fixedNumber: [1, 1], // 截图框的宽高比例
full: true, // 是否输出原图比例的截图
canMoveBox: false, // 截图框能否拖动
original: false, // 上传图片按照原始比例渲染
centerBox: false, // 截图框是否被限制在图片里面
infoTrue: false, // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
mode: '100% auto' // 图片默认渲染方式
}
}
}
}
</script>
2.点击头像选择文件,裁剪压缩并上传
这里需要判断是否为苹果手机;
苹果手机点击上传头像会默认弹框显示拍照还是从文件中选择,安卓手机点击上传头像则默认从文件中选择;
这里判断如果是安卓手机则显示我们自定义的弹框供用户选择是拍照还是从文件中选择
<!--点击上传头像 -->
<van-cell-group>
<van-cell title="头像" is-link @click="checkIsIos" /><!-- 检测是否为苹果手机 -->
<img v-if="fromWX" :src="wxImgUrl"> <!-- 默认显示微信头像(带http的绝对链接) -->
<img v-else :src="headImgUrl">
<input type="file" name="fileIOS" @change="changeImgIOS" accept="image/*" ref="inputFileRefIOS" style="display:none;" />
</van-cell>
</van-cell-group>
<!--安卓上传头像弹框,需要注意的是调用相机时,type="file" name="file" capture="camera" 必须写正确,否则调用相机不成功 -->
<van-popup v-model="uploadModal" position="bottom">
<div>
<div @click="openFile">从相册中选择</div>
<input type="file" name="file" @change="changeImg" accept="image/*" ref="inputFileRef" style="display:none;" />
<div @click="openFile">拍照</div>
<input type="file" name="file" @change="changeImg" accept="image/*" ref="inputFileRef" capture="camera" style="display:none;" />
<div @click="uploadModal = false">取消</div>
</div>
</van-popup>
methods:{
checkIsIoS(){//点击头像调用的方法
if(!this.isIOS){//非IOS则显示自定义弹框
this.uploadModal = true
this.isCamera = true
}else{
this.$refs.inputFIleRefIOS.click()//IOS选择文件,触发changeImgIOS方法
}
},
//IOS选择文件
changeImgIOS(){
let file = this.$refs.inputFIleRefIOS.file[0]
this.showCropper = true//显示裁剪框
this.imageFileName = file.name //保存上传的文件名,方便后续用到
this.imageToBase64(file)//图片压缩并转化为base64,否则cropper组件显示不出要裁剪的图片
},
//安卓选择文件,从相册中选择
openFile(){
this.$refs.inputFIleRef.click()
},
//安卓选择文件,调用相机
openFile(){
this.isCamera = true
this.$refs.inputFIleRef.click()
},
changeImg(){
this.uploadModal = false
let file = null
if(this.isCamera){
file = this.$refs.inputFIleRefCamera.files[0]//相机拍照的
}else{
file = this.$refs.inputFIleRef.files[0]//相册选择的
}
this.showCropper = true
this.imageFileName = file.name
this.imageToBase64(file)
},
imageToBase64(file){
this.option.img = ''//清空上一次裁剪的图片
let reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = () =>{
if(file.size>(1*1024*1024)){//大于 1M 的图片压缩
let scaleSize = 0.9//定义压缩的比例(程度)
let image = new Image()
image.src = reader.result;
image.onload = () =>{
if(file.size>(1*1024*1024) && file.size<(2*1024*1024+1)){//1-2M
scaleSize = 0.9
}
if(file.size>(2*1024*1024) && file.size<(3*1024*1024+1)){//2-3M
scaleSize = 0.9
}
if(file.size>(3*1024*1024) && file.size<(4*1024*1024+1)){//3-4M
scaleSize = 0.9
}
if(file.size>(4*1024*1024)){//4M+
scaleSize = 0.9
}
let img64 = this.compress(image,scaleSize)
this.option.img = img64
}
}else{
this.option.img = reader.result
}
}
reader.onerror = (rrror) =>{
console.log(error)
}
},
compress(img,ratio){//图片压缩并转化为base64返回
let canvas,ctx,img64;
let width = img.width*0.6//改变上传的图片像素,缩放至原来的0.6
let height = img.height*0.6
canvas = document.createElement('canvas')
canvas.width = width
canvas.height = height
ctx = canvas.getContext('2d')
ctx.drawImage(img,0,0,width,height)
img64 = canvas.toDataURL('image/jpeg',ratio)//参考 https://www.runoob.com/jsref/met-canvas-drawimage.html
return img64
},
//绑定在cropper组件上的方法,确认裁剪并上传图片到后台
getCropBlob(){
let toast = Toast.loading({
duration:0,
forbidClick:true,
message:'加载中'
})
let formData = new FormData()
this.$refs.cropper.getCropBlob(async (data) =>{
formData.append('custId',this.custId)
formData.append('multiReq',data,this.imageFileName)
let rs = await axios({
method:'post',
url:cfg.baseURL.XXX + '',
data:formData,
headers:{
openId:sessionStorage.getItem('openId')
}
})
if(rs.data.code=='200'){
Toast.clear()
Toase.success('上传成功')
}else{
Toast.clear()
Toase.fail('修改异常')
}
this.showCropper = false //隐藏裁剪遮罩
this.isCamera = false
})
},
//旋转图片
rotateImage(){
this.$refs.cropper.rotateImage()
},
//取消截图上传头像
cancelCropper(){
this.showCropper = false;
this.isCamera = false
}
},
mounted(){
let u = navigator.userAgent
this.isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)
},
vue-cropper 移动端上传图片压缩裁剪的更多相关文章
- 基于layui+cropper.js实现上传图片的裁剪功能
最近因项目需求,需要在上传图片的时候先对图片裁剪,然后在上传,所以就有了本文的出现. 开始正文之前,要提一下这个图片的裁剪:图片的裁剪,有前端裁剪,也可以后端裁剪 前端的裁剪我知道的可以分为这么两种: ...
- .NET压缩图片保存 .NET CORE WebApi Post跨域提交 C# Debug和release判断用法 tofixed方法 四舍五入 (function($){})(jQuery); 使用VUE+iView+.Net Core上传图片
.NET压缩图片保存 需求: 需要将用户后买的图片批量下载打包压缩,并且分不同的文件夹(因:购买了多个用户的图片情况) 文章中用到了一个第三方的类库,Nuget下载 SharpZipLib 目前用 ...
- 【jQuery插件】使用cropper实现简单的头像裁剪并上传
插件介绍 这是一个我在写以前的项目的途中发现的一个国人写的jQuery图像裁剪插件,当时想实现用户资料的头像上传功能,并且能够预览图片,和对图片进行简单的裁剪.旋转,花了不少时间才看到了这个插件,感觉 ...
- 纯原生js移动端图片压缩上传插件
前段时间,同事又来咨询一个问题了,说手机端动不动拍照就好几M高清大图,上传服务器太慢,问问我有没有可以压缩图片并上传的js插件,当然手头上没有,别慌,我去网上搜一搜. 结果呢,呵呵...诶~又全是基于 ...
- Android端上传图片到后台,存储到数据库中 详细代码
首先点击头像弹出popwindow,点击相册,相机,调用手机自带的裁剪功能,然后异步任务类访问服务器,上传头像,保存到数据库中, 下面写出popwindow的代码 //设置popwindow publ ...
- 追求极致的用户体验ssr(基于vue的服务端渲染)
首先这篇博客并不是ssr建议教程,需要ssr入门的我建议也不要搜索博客了,因为官网给出了详细的入门步骤,只需要step by step就可以了,这篇博客的意义是如何使用ssr,可能不同的人有不同的意见 ...
- Cropper – 简单的 jQuery 图片裁剪插件
Cropper 是一个简单的 jQuery 图像裁剪插件.它支持选项,方法,事件,触摸(移动),缩放,旋转.输出的裁剪数据基于原始图像大小,这样你就可以用它们来直接裁剪图像. 如果你尝试裁剪跨域图像, ...
- Vue.js 服务端渲染业务入门实践
作者:威威(沪江前端开发工程师) 本文原创,转载请注明作者及出处. 背景 最近, 产品同学一如往常笑嘻嘻的递来需求文档, 纵使内心万般拒绝, 身体倒是很诚实. 接过需求,好在需求不复杂, 简单构思 后 ...
- ASP.NET Core 与 Vue.js 服务端渲染
http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oop ...
- vue.js移动端配置flexible.js
前言 最近在用vue做移动端项目,网上找了一些移动端适配的方案,个人觉得手淘团队flexible.js还是比较容易上手,在这里做下总结. 主体 flexible.js适配方案采用rem布局,根据屏幕分 ...
随机推荐
- IDEA中无法import自己工程中类的问题解决方法
今天开个很久没搞的工程,刚开的时候一片红,很自然的想到,要去配置一下项目的JDK,但是配置好之后,又出了个诡异问题:项目可以运行,但是import项目内部自己写的类的时候,都出现了红色错误.虽然imp ...
- 【译】 双向流传输和ASP.NET Core 3.0上的gRPC简介
原文相关 原文作者:Eduard Los 原文地址:https://medium.com/@eddyf1xxxer/bi-directional-streaming-and-introduction- ...
- vue双向定位导航效果
需求:实现双向定位导航效果,点击左侧菜单,右侧滚动到相应的位置.滚动右边,左侧相应菜单高亮. html代码: 1 <ul class="EntTake_main_left" ...
- C#利用控件实现柱形图分析
数据 { using (SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=;database=db_TomeOne&quo ...
- Go ASM 学习笔记之 ppt 版
在 小白学标准库之反射 reflect 篇中介绍了接口和反射.然而,对于接口的类型转换,底层实现还是一知半解.在参考 Go 语言设计与实现 这本书接口章节时,又看不大懂.一个拦路虎摆在面前:汇编.不懂 ...
- 【Git】用法小记
解决windows环境下的CRLF与unix环境下的LF问题,windows提交时CRLF=>LF,签出时LF=>CRLF,unix环境保留 git config --global cor ...
- [转帖]linux系统上free命令看到的buff/cache到底是什么
https://zhuanlan.zhihu.com/p/645904515 上周二一大早,小智准备早点去公司肝一篇技术文分享给大家的,哪成想,一到公司就被测试部的"卷王"拉去看问 ...
- [转帖]Oracle的审计
AUDIT_TRAIL 初始化参数AUDIT_TRAIL用于控制数据库审计,默认值为none. 参数类型: String 默认值: none 允许动态修改: 否 基本参数: 否 语法: AUDIT_T ...
- [转帖]xtrabackup2.4备份恢复脚本
https://developer.aliyun.com/article/534230#:~:text=xtrabackup2.4%E5%A4%87%E4%BB%BD%E6%81%A2%E5%A4%8 ...
- [转帖]针对容器的nginx优化
针对容器的nginx优化 本篇文章介绍了 Nginx 在容器内使用遇到的CPU核数获取问题以及对应的解决方法. 回顾上篇文章:TCP 半连接队列和全连接队列 背景 容器技术越来越普遍,很多公司已经将容 ...