1.图片压缩
/**
* 图片base64转换 图片压缩
* @param this
* @param file
* @param {boolean} 选参,默认压缩
* @param {Array} 选参,默认支持的图片类型 jpeg ,png ,bmp
* @param {Number} 选参,默认10M
* @param {Number} 选参,压缩图片目标宽度,默认413px
* @param {Number} 选参,压缩图片目标高度,默认626px
* @param {Number} 选参,导出的图片质量,默认值是0.85
* @date 2019/03/22
* @version 0.0.1
*/
export const UPLOAD_PICTURE = function (obj, file, zip = true, fileType = ['jpeg', 'png', 'bmp'], s = 10, w = 413, h = 626, q = 0.85) {
let that = obj
return new Promise(function (resolve, reject) {
// 限制图片大小
const isLt10M = file.size / 1024 / 1024 < s
// 限制图片格式
let isFormat = 0
for (var i = 0; i < fileType.length; i++) {
if ('image/' + fileType[i] === file.type) {
isFormat++
}
}
let ft = fileType.join(',')
if (!isFormat) {
return that.$message.error(`上传头像图片仅限于 ${ft} 格式!`)
}
if (!isLt10M) {
that.$message.error(`上传头像图片大小不能超过 ${s}MB!`)
return false
}
// 选择的文件是图片
if (file.type.indexOf('image') === 0) {
// 压缩图片需要的一些元素和对象
let reader = new FileReader()
// 创建一个img对象
let img = new Image()
reader.readAsDataURL(file)
// 文件base64化,以便获知图片原始尺寸
reader.onload = function (e) {
img.src = e.target.result
if (!zip) {
resolve(img.src)
}
}
if (!zip) {
return false
}
// base64地址图片加载完毕后执行
img.onload = function () {
// 缩放图片需要的canvas(也可以在DOM中直接定义canvas标签,这样就能把压缩完的图片不转base64也能直接显示出来)
let canvas = document.createElement('canvas')
let context = canvas.getContext('2d')
// 图片原始尺寸
let originWidth = this.width
let originHeight = this.height
// 最大尺寸限制,可通过设置宽高来实现图片压缩程度
let maxWidth = w
let maxHeight = h
// 目标尺寸
let targetWidth = originWidth
let targetHeight = originHeight
// 图片尺寸超过300x300的限制
if (originWidth > maxWidth || originHeight > maxHeight) {
if (originWidth / originHeight > maxWidth / maxHeight) {
// 更宽,按照宽度限定尺寸
targetWidth = maxWidth
targetHeight = Math.round(maxWidth * (originHeight / originWidth))
} else {
targetHeight = maxHeight
targetWidth = Math.round(maxHeight * (originWidth / originHeight))
}
}
// canvas对图片进行缩放
canvas.width = targetWidth
canvas.height = targetHeight
// 清除画布
context.clearRect(0, 0, targetWidth, targetHeight)
// 图片压缩
context.drawImage(img, 0, 0, targetWidth, targetHeight)
/* 第一个参数是创建的img对象;第二三个参数是左上角坐标,后面两个是画布区域宽高 */
// 压缩后的图片转base64 url
/* canvas.toDataURL(mimeType, qualityArgument),mimeType 默认值是'image/png';
* qualityArgument表示导出的图片质量,只有导出为jpeg和webp格式的时候此参数才有效,默认值是0.92 */
let newUrl = canvas.toDataURL('image/jpeg', q)// base64 格式
resolve(newUrl)
}
}
})
}
/**
* 图片base64转换 裁剪图片
* @param myCroppa
*/
export const UPLOAD_PICTURE_CROP = function (myCroppa) {
return new Promise(function (resolve, reject) {
myCroppa.generateBlob((blob) => {
// console.log(blob)
resolve(myCroppa.generateDataUrl())
}, 'image/png', 1.0)
})
}
- 深拷贝
/**
* 深拷贝对象,可以正确序列化日期
* @param {*} obj
*/
export const DEEP_CLONE = function (obj) {
let objClone = Array.isArray(obj) ? [] : {}
if (obj && typeof obj === 'object') {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
// 判断ojb子元素是否为对象,如果是,递归复制
if (obj[key] && typeof obj[key] === 'object') {
// 深拷贝日期类型
if (obj[key] instanceof Date) {
objClone[key] = new Date(obj[key].valueOf())
// console.log('deepClone', objClone[key])
} else {
objClone[key] = DEEP_CLONE(obj[key])
}
} else {
// 如果不是,简单复制
objClone[key] = obj[key]
}
}
}
}
return objClone
}