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布局,根据屏幕分 ...
随机推荐
- 2019年第十届蓝桥杯国赛C++C组
蓝桥杯历年国赛真题汇总:Here 统一声明 如果不写默认带有常用头文件 如果不表明主函数默认表示在 void solve(){} 默认使用 using namespace std; ios::sync ...
- 1、springboot工程新建(单模块)
系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...
- 如何使用photoshop修改图片的像素大小(分辨率)
查看原始图片的分辨率如下:640*399
- 06-逻辑仿真工具VCS-Debug
逻辑仿真工具VCS verdi只进行debug进行使用,不进行编译,只进行产生波形之后的debug 仿真速度和代码质量有关系,选项也会影响仿真速度,行为级>RTL>门级 信号的可见性和可追 ...
- 【转】嵌入式C语言代码优化方案
来源:嵌入式C语言代码优化方案(深度好文,建议花时间研读并收藏) (qq.com) 1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使 ...
- android应用申请加入电池优化白名单
首先,在 AndroidManifest.xml 文件中配置一下权限: 1 <uses-permission android:name="android.permission.REQU ...
- Django-Import-Export插件关于外键的处理
前言 Django-Import-Export是一款很好用很方便的Django数据导出导入插件,可以和DjangoAdmin管理后台完美集成,只需要少量的代码配置即可方便实现你要的多种格式导出导入,关 ...
- [转帖]ORACLE新参数MAX_IDLE_TIME和MAX_IDLE_BLOCKING_TIME简介
https://www.cnblogs.com/kerrycode/p/16856171.html Oracle 12.2 引入了新参数MAX_IDLE_TIME.它可以指定会话空闲的最大分钟数.如果 ...
- ingress nginx 支持的K8S版本以及nginx版本信息
- [转帖]centos6 free 和 centos 7的free 的差异与对比
目录 一 centos6 free 常用参数和含义 centos6 free 命令示例 free 值讲解 计算公式 二 centos7 free 常用的参数 centos7 free 命令示例 计算公 ...