头像裁剪压缩上传流程:

点击头像--判断是否为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 移动端上传图片压缩裁剪的更多相关文章

  1. 基于layui+cropper.js实现上传图片的裁剪功能

    最近因项目需求,需要在上传图片的时候先对图片裁剪,然后在上传,所以就有了本文的出现. 开始正文之前,要提一下这个图片的裁剪:图片的裁剪,有前端裁剪,也可以后端裁剪 前端的裁剪我知道的可以分为这么两种: ...

  2. .NET压缩图片保存 .NET CORE WebApi Post跨域提交 C# Debug和release判断用法 tofixed方法 四舍五入 (function($){})(jQuery); 使用VUE+iView+.Net Core上传图片

    .NET压缩图片保存   需求: 需要将用户后买的图片批量下载打包压缩,并且分不同的文件夹(因:购买了多个用户的图片情况) 文章中用到了一个第三方的类库,Nuget下载 SharpZipLib 目前用 ...

  3. 【jQuery插件】使用cropper实现简单的头像裁剪并上传

    插件介绍 这是一个我在写以前的项目的途中发现的一个国人写的jQuery图像裁剪插件,当时想实现用户资料的头像上传功能,并且能够预览图片,和对图片进行简单的裁剪.旋转,花了不少时间才看到了这个插件,感觉 ...

  4. 纯原生js移动端图片压缩上传插件

    前段时间,同事又来咨询一个问题了,说手机端动不动拍照就好几M高清大图,上传服务器太慢,问问我有没有可以压缩图片并上传的js插件,当然手头上没有,别慌,我去网上搜一搜. 结果呢,呵呵...诶~又全是基于 ...

  5. Android端上传图片到后台,存储到数据库中 详细代码

    首先点击头像弹出popwindow,点击相册,相机,调用手机自带的裁剪功能,然后异步任务类访问服务器,上传头像,保存到数据库中, 下面写出popwindow的代码 //设置popwindow publ ...

  6. 追求极致的用户体验ssr(基于vue的服务端渲染)

    首先这篇博客并不是ssr建议教程,需要ssr入门的我建议也不要搜索博客了,因为官网给出了详细的入门步骤,只需要step by step就可以了,这篇博客的意义是如何使用ssr,可能不同的人有不同的意见 ...

  7. Cropper – 简单的 jQuery 图片裁剪插件

    Cropper 是一个简单的 jQuery 图像裁剪插件.它支持选项,方法,事件,触摸(移动),缩放,旋转.输出的裁剪数据基于原始图像大小,这样你就可以用它们来直接裁剪图像. 如果你尝试裁剪跨域图像, ...

  8. Vue.js 服务端渲染业务入门实践

    作者:威威(沪江前端开发工程师) 本文原创,转载请注明作者及出处. 背景 最近, 产品同学一如往常笑嘻嘻的递来需求文档, 纵使内心万般拒绝, 身体倒是很诚实. 接过需求,好在需求不复杂, 简单构思 后 ...

  9. ASP.NET Core 与 Vue.js 服务端渲染

    http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oop ...

  10. vue.js移动端配置flexible.js

    前言 最近在用vue做移动端项目,网上找了一些移动端适配的方案,个人觉得手淘团队flexible.js还是比较容易上手,在这里做下总结. 主体 flexible.js适配方案采用rem布局,根据屏幕分 ...

随机推荐

  1. 【Boost】CMake中引用Boost库

    概述 在macOS开发时常常使用Boost库,若项目使用CMake进行组织管理和编译,需要掌握在CMake中实现Boost库的引用的基本语法.本片博客结合自己在实际使用过程中的经验进行总结,以期回顾和 ...

  2. Java | VS Code 如何导入外部 jar 包源

    Java Extension Pack里的Project Manager for Java扩展,安装后在文档查看的下方会有"JAVA PROJECTS",在Referenced L ...

  3. 如何在公司项目中使用 WebSocket— 入门实战指南

    本文从 WebSocket 基础概念出发,介绍在实际开发中从本地联调到部署上线的流程以及注意事项,让 WebSocket 小白以最小成本应用到项目中. 一.WebSocket 基础 1.什么是 Web ...

  4. 《3D编程模式》写书-第4次记录

    大家好,这段时间我完成了"再看设计原则"的初稿,包括了设计基础.单一职责原则.依赖倒置原则.接口隔离原则.合成复用原则.最少知识原则.开闭原则 目前我已经完成了所有的初稿,后面会进 ...

  5. 黑池舞蹈节banner

  6. PHP安全之道学习笔记6:密码安全

    PHP安全之道:密码安全    最近几年用户数据泄露越发频繁,一些使用PHP技术的大型网站被暴库或者脱库,facebook公司曾因为此类事件股价暴跌.从长远发展来看,用户的数据安全对于网站来说至关重要 ...

  7. 例2.9 建立一个带头结点的线性链表,用以存放输人的二进制数,链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。

    1.题目 例2.9建立一个带头结点的线性链表,用以存放输人的二进制数,链表中每个结点的data域存放一个二进制位.并在此链表上实现对二进制数加1的运算. 2.算法分析 3.代码 /* 二进制加1 */ ...

  8. SpringBoot02:运行原理初探

    @EnableAutoConfiguration @EnableAutoConfiguration:开启自动配置功能 以前我们需要自己配置的东西,而现在SpringBoot可以自动帮我们配置 @Ena ...

  9. [转帖]oracle数据库中RMAN备份格式化format解释

    格式化解释: 使用格式串 更改格式命令: RMAN> configure channel device type disk format ' E:\app\Administrator\db_ba ...

  10. [转帖]tiup cluster scale-in

    https://docs.pingcap.com/zh/tidb/stable/tiup-component-cluster-scale-in tiup cluster scale-in 命令用于集群 ...