1
0
Fork 0
5g-track/src/utils/handleImage.js

168 lines
5.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import EXIF from 'exif-js' //获取拍照时的信息的库(角度),用于调正图片展示角度
import imageConversion from 'image-conversion' //图片压缩、转换处理库
/**
* 压缩文件函数
* 传入图片-压缩后的尺寸kb-压缩率
* 返回压缩后的文件
* @param {file} imageFile
* @param {number} compressSize
* @param {number} quality
*/
export function JudgeCompress(imageFile, compressSize, quality = 0.99) { //传入图片文件-规定压缩后的尺寸kb-压缩率
return new Promise(function (resolve,reject) {
if(imageFile.size < 100 * 1024) { //如果图片小于规定尺寸,则直接返回
resolve(imageFile)
return
}
imageConversion.compressAccurately(imageFile,{size:compressSize,accuracy:quality,scale:0.5}).then(res =>{ //压缩函数
resolve(res)
})
})
}
/**
* 图片文件转base64 DataUrl
* @param {file} file
*/
export function FiletoDataURL(file){
return new Promise((resolve,reject) => {
imageConversion.filetoDataURL(file).then(res => {
resolve(res)
})
})
}
/**
* 判断文件类型是否为image
* @param {file} file
*/
export function CheckFile(file) {
if (!/image\/\w+/.test(file.type)) {
return false;
}
return file;
}
/**
* 旋转图片总体函数
* 传入文件,返回旋转后的文件
* @param {file} imageFile
*/
export function RotateImage(imageFile) {
return new Promise((resolve,reject)=>{
imageConversion.filetoDataURL(imageFile).then(res =>{ //把文件转成图片格式用于旋转
var image = new window.Image();
image.src = res
image.onload = function () {
// 旋转图片
let newImage = handleRotate(image)
imageConversion.dataURLtoFile(newImage.src).then(res => {
resolve(res) //返回的是file文件
})
}
})
})
// 使用如上filetoDataURL插件方法实现文件转url 而 替代本手写方法 by:luqiang 20191012
// var reader = new FileReader();
// reader.onload = function(e){
// }
// reader.readAsDataURL(imageFile); //先挂载onload方法再绑定read事件
}
/**
* 处理旋转函数,传入图片,返回旋转正确的图片
* @param {img} image
*/
function handleRotate(image){ //处理旋转的函数
var width = image.width;
var height = image.height;
var canvas = document.createElement("canvas")
var ctx = canvas.getContext('2d');
var newImage = new Image();
//旋转图片操作
EXIF.getData(image, function () {
var orientation = EXIF.getTag(this, 'Orientation');
let imageDate = null
switch (orientation) {
//正常状态
case 1:
// alert('旋转0°');
newImage.src = image.src;
break;
//旋转90度
case 6:
// alert('旋转90°');
canvas.height = width;
canvas.width = height;
ctx.rotate(Math.PI / 2);
ctx.translate(0, -height);
ctx.drawImage(image,0,0)
imageDate = canvas.toDataURL('image/jpeg', 1)
newImage.src = imageDate;
break;
//旋转180°
case 3:
// alert('旋转180°');
canvas.height = height;
canvas.width = width;
ctx.rotate(Math.PI);
ctx.translate(-width, -height);
ctx.drawImage(image,0,0)
imageDate = canvas.toDataURL('image/jpeg', 1)
newImage.src = imageDate;
break;
//旋转270°
case 8:
// alert('旋转270°');
canvas.height = width;
canvas.width = height;
ctx.rotate(-Math.PI / 2);
ctx.translate(-height, 0);
ctx.drawImage(image, -810,0) //????安卓要-810
// ctx.drawImage(image)
imageDate = canvas.toDataURL('image/jpeg', 1)
newImage.src = imageDate;
break;
//undefined时不旋转
case undefined:
// alert('旋转0°');
newImage.src = image.src;
break;
default:
newImage.src = image.src;
break;
}
}
);
return newImage;
}
// 压缩图片函数 --> by:luqiang 20191012 使用imageConversion库代替手写操作以精准控制压缩后的文件尺寸
// function Compress(image, quality) {
// var canvas = document.createElement('canvas')
// var ctx = canvas.getContext('2d');
// var width = image.width;
// var height = image.height;
// canvas.width = width;
// canvas.height = height;
// ctx.drawImage(image, 0, 0, width, height);
// //压缩操作
// var imageData = canvas.toDataURL("image/jpeg", quality);
// var imageLength = image.src.length;
// console.log("压缩前:" + imageLength);
// console.log("压缩后:" + imageData.length,imageData);
// console.log("压缩率:" + ~~(100 * (imageLength - imageData.length) / imageLength) + "%");
// return imageData;
// }