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布局,根据屏幕分 ...
随机推荐
- SpringBoot 项目实战 | 瑞吉外卖 Day04
该系列将记录一份完整的实战项目的完成过程,该篇属于第四天 案例来自B站黑马程序员Java项目实战<瑞吉外卖>,请结合课程资料阅读以下内容 该篇我们将完成以下内容: 文件上传下载 新增菜品 ...
- P1379 八数码难题 ( A* 算法 与 IDA_star 算法)
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- Centos7 kubeadm安装k8s
安装环境准备 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 关闭selinux sed -i 's/enforcing/disa ...
- <vue 基础知识 6、条件判断标签v-if>
代码结构 一. 01-v-if用法 1.效果 根据分数的不同展现不同的汉字 2.代码 01-v-if用法.html <!DOCTYPE html> <html lang=&q ...
- 简易机器学习笔记(八)关于经典的图像分类问题-常见经典神经网络LeNet
前言 图像分类是根据图像的语义信息对不同类别图像进行区分,是计算机视觉的核心,是物体检测.图像分割.物体跟踪.行为分析.人脸识别等其他高层次视觉任务的基础.图像分类在许多领域都有着广泛的应用,如:安防 ...
- Autowired注入Service变成了biaomidou的Mapper代理
问题概述 一个Springboot工程,使用Mybatis-plus作为数据层框架 使用@MapperScan注解扫描Mapper接口 @MapperScan("org.net5ijy.cl ...
- 【Spring 5核心原理】1设计模式
1.1开闭原则 开闭原则(open-closed principle,OCP)是指一个软件实体(如类,模块和函数)应该对扩展开放,对修改关闭.所谓的开闭,也正是对扩展和修改两个行为的一个原则. 强调用 ...
- [转帖]Nginx - 根据IP分配不同的访问后端
https://www.cnblogs.com/hukey/p/11868017.html 1. 需求分析 为了在线上环境提供测试分支,规定将某IP转发到测试程序地址.如果是 ngx 直接对外,采用 ...
- 银河麒麟在线升级新版本docker
银河麒麟在线升级新版本docker 卸载 学习来自: https://cloud.tencent.com/developer/article/1491742 yum remove docker \ d ...
- [转帖]linux audit审计(7-1)--读懂audit日志
https://www.cnblogs.com/xingmuxin/p/8807774.html auid=0 auid记录Audit user ID,that is the loginuid.当我 ...