Vant 中 Uplodaer 拍照并压缩图片
引入uploader,这部分官网就有就不多说了
import Vue from 'vue';
import { Uploader } from 'vant';
Vue.use(Uploader);
使用,在使用前请阅读Uploader部分的API
<van-uploader
v-model="uploader"
capture="camera"
multiple
:max-count="1"
:after-read="afterRead" />
二、调用压缩方法压缩图片
import { compressImage } from '@/assets/js/compressImage'
export default {
name:'residentRegister',
data(){
return{
uploader: [],
photo:''
}
},
methods:{
afterRead(file) {
let config = {
width: 358,
height: 441,
quality: 0.9
}
compressImage(file.file, config).then(result => {
this.photo = result
})
},
getImgSize(base64url) {
var str = base64url.replace('data:image/png;base64,', '');
var equalIndex = str.indexOf('=');
if(str.indexOf('=')>0) {
str=str.substring(0, equalIndex);
}
var strLength=str.length;
var fileLength=parseInt(strLength-(strLength/8)*2);
var size = "";
size = (fileLength / 1024).toFixed(2);
var sizeStr = size + "";
var index = sizeStr.indexOf(".");
var dou = sizeStr.substr(index + 1, 2)
if (dou == "00") {
return sizeStr.substring(0, index) + sizeStr.substr(index + 3, 2)
}
return size;
}
}
}
压缩图片的方法 新建
export function compressImage (file, config) {
let src
let files
const read = new FileReader()
read.readAsDataURL(file)
return new Promise(function (resolve, reject) {
read.onload = function (e) {
let img = new Image()
img.src = e.target.result
img.onload = function () {
let w = config.width
let h = config.height
let canvas = document.createElement('canvas')
let ctx = canvas.getContext('2d')
let base64
canvas.setAttribute('width', w)
canvas.setAttribute('height', h)
ctx.drawImage(this, 0, 0, w, h)
base64 = canvas.toDataURL(file['type'], config.quality)
resolve(base64)
}
}
})
};
function dataURLtoBlob (dataurl) {
let arr = dataurl.split(',')
let mime = arr[0].match(/:(.*?);/)[1]
let bstr = atob(arr[1])
let n = bstr.length
let u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new Blob([u8arr], { type: mime })
}
function dataURLtoFile (dataurl) {
let arr = dataurl.split(',')
let mime = arr[0].match(/:(.*?);/)[1]
let bstr = atob(arr[1])
let n = bstr.length
let u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new File([u8arr], { type: mime })
}
最后,这个压缩方法其实是我找到的最有效的压缩方法,因为之前使用的是另一种压缩方法,他的方法比较齐全,我在我和手机在电脑上测试都是没问题的,但是在ios上就发现有问题。ios不支持这种压缩方法,但是如果不考虑ios系统的话,这种压缩方法其实更好一点。