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布局,根据屏幕分 ...
随机推荐
- CH6803 导弹防御塔 (二分 + 匈牙利 / 网络流)
链接:https://ac.nowcoder.com/acm/contest/1062/D 题目描述 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵 ...
- 微前端qiankun
- babel7 的配置加载逻辑
babel.config.js 是对整个项目(父子package) 都生效的配置,但要注意babel的执行工作目录. .babelrc 是对 待编译文件 生效的配置,子package若想加载.babe ...
- vmware超融合基础安装与配置
目录 vmware超融合 安装配置ESXI 安装VMware vCenter Server 安装vCenter插件 安装vCenter 使用VMware Vsphere Client登录Vcenter ...
- 问题--C中结构体想要嵌套一个该结构体指针,但是系统无法识别该类型
代码如下: typedef struct_Person{ char name[64]; int age; //Person* person; //这里会出现一个问题,由于Person是在末尾定义的,那 ...
- 你和时间管理大师,就差一个开源工具「GitHub 热点速览」
在这个快节奏的生活中,我们努力地在平衡工作.生活和个人发展,但常常感到时间不够用.如何在繁忙的日程中找到一丝丝"喘息"的机会,这个名叫 cal.com 开源项目能让你更轻松地管理日 ...
- 【SHELL】查找包含指定字符串的目录、在找出的路径中找出指定格式的文件、并统计出数量
查找包含字符串"skull"的目录.在找出的路径中找出格式".c/.cpp/.h"的文件.并统计出数量 find . -path ./out -prune -o ...
- [转帖]一、Kafka Tool使用
一.Kafka Tool使用 1.添加cluster 2.开启SASL_PLAINTEXT 如果kafka 开启SASL_PLAINTEXT认证(用户名和密码认证) 3.高级设置 如果设置的是SASL ...
- OpenEuler切换内核的方法-bcc学习后续
OpenEuler切换内核的方法 摘要 昨天使用OpenEuler 22.03 LTS学习bcc但是一直不行. 没办法切换到CentOS8 还有 Anolis 8 很容易就可以直接还是用了 yum i ...
- Linux 环境下 node 以及 jit 的简单环境配置说明
注意事项: 1. 注意这个包需要实时更新. 2. 更新时需要按照目录覆盖文件. 3. 谁负责谁治理的态度, 有更新,需要完整的进行覆盖安装. 建议先删除旧文件, 替换新文件. 4. 为了简单起见, 直 ...