壓縮的圖片質(zhì)量是從0到1的范圍取值,數(shù)值越小,壓縮的圖片越小,我用的默認(rèn)值0.92
1.02M --> 229KB
2.53M --> 523KB
3.46M --> 723KB
如果圖片過大(大于4.5M左右),壓縮后仍然會(huì)大于1M,就會(huì)在壓縮后的基礎(chǔ)上再次進(jìn)行壓縮
4.73M --> 225KB
// 選擇圖片
chooseImgs() {
let that = this
uni.chooseImage({
count: 1, //默認(rèn)9
success: res => {
this.images = res.tempFiles[0].path
console.log('壓縮前', res.tempFiles[0])
// 大于1M壓縮
if (Math.ceil(res.tempFiles[0].size / 1024) > 1024) {
that.compress(res.tempFiles[0])
} else {
that.uploadImage(res.tempFiles[0])
}
}
})
},
// 壓縮圖片
compress(file, limit = 0.92, file_size = 50) {
let _this = this
return new Promise((resolve, reject) => {
if (!file) {
reject(new Error('不存在文件'))
}
const type = file.type
const size = file.size
const whiteType = ['image/jpeg', 'image/png']
if (whiteType.indexOf(type) === -1) { // 判斷文件類型
reject(new Error('錯(cuò)誤的文件類型'))
}
if (Math.ceil(size / 1024) < file_size) { // 判斷文件大小
resolve(file)
}
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = e => {
const img = new Image()
img.src = e.target.result
img.onload = () => {
const ratio = img.naturalHeight / img.naturalWidth
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
canvas.width = img.width > 750 ? 750 : img.width // 固定寬度
canvas.height = img.width * ratio
ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
// limit: 0到1之間的取值,主要用來選定圖片的質(zhì)量,默認(rèn)值是0.92,超出范圍也會(huì)選擇默認(rèn)值。
const newImg = canvas.toDataURL('image/jpeg', limit)
// 將base64轉(zhuǎn)換為filel流,
let flie= _this.convertBase64UrlToFile({
dataURL: newImg,
type: 'image/jpeg',
contentName: file.name
})
console.log('flie',flie)
_this.uploadImage(flie)
}
}
})
},
// 轉(zhuǎn)base64
convertBase64UrlToFile(base64) {
let urlData = base64.dataURL
let type = base64.type
let contentName = base64.contentName
let bytes = null
if (urlData.split(',').length > 1) { //是否帶前綴
bytes = window.atob(urlData.split(',')[1]) // 去掉url的頭,并轉(zhuǎn)換為byte
} else {
bytes = window.atob(urlData)
}
// 處理異常,將ascii碼小于0的轉(zhuǎn)換為大于0
let ab = new ArrayBuffer(bytes.length)
let ia = new Uint8Array(ab)
for (let i = 0; i < bytes.length; i++) {
ia[i] = bytes.charCodeAt(i)
}
let result = new Blob([ab], {
type: type,
})
let result1 = new File([result], contentName, {
type: type
})
result1.path = window.URL.createObjectURL(result)
return result1
},
// 上傳圖片
uploadImage(img) {
console.log(img.path)
uni.uploadFile({
url: 'http://xxxxxx.cn/api/CKSelect',
filePath: img.path,
name: 'image',
success: (res) => {
uni.hideLoading()
const data = JSON.parse(res.data)
if (data.code == 200 && data.data) {
this.info = data.data
} else {
this.info = {}
uni.showModal({
content: data.msg || '查詢失敗',
showCancel: false,
success: function (res) {
if (res.confirm) {
that.images = require('../../static/img/up.png')
}
}
})
}
},
fail: function(err) {
uni.hideLoading()
uni.showToast({
title: '失敗',
icon: 'none'
})
}
});
}