图片压缩
基于vue的图片上传压缩
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>基于vue的图片上传压缩title>head>
<body>
<input class="hiddenInput" type="file" name="uploadFile" id="imageFile" accept="image/*" @change="uploadImg($event)"/>
body>
html>
<script>
//图片压缩//
function photoCompress(file) {
return new Promise((resolve, reject) => {
let reader = new FileReader();
reader.onload = function () {
img.src = e.target.result;
}
reader.onerror = function (e) {
reject(e);
}
reader.readAsDataURL(file);
img.onload = function () {
resolve(img);
}
img.onerror = function () {
reject(e);
}
})
}
//canvas绘制图片//
function canvasDataURL(img, type, mx, mh) {
return new Promise((resolve, reject) => {
let canvas = document.createElement('canvas');
let context = canvas.getContext('2d');
let ctx = canvas.getContext('2d');
let quality = 0.7// 默认图片质量为0.7//
// 创建属性节点
let anw = document.createAttribute('width')
anw.nodeValue = mx
let anh = document.createAttribute('height')
anh.nodeValue = mh
canvas.setAttributeNode(anw)
canvas.setAttributeNode(anh)
ctx.drawImage(img, 0, 0, mx, mh);
// 图像质量 // //
if (file.size > 300 * 1024) {
quality = 0.3
}
// quality值越小,所绘制出的图像越模糊//
let base64 = canvas.toDataURL('image/jpeg', quality)
resolve(base64)
})
}
function convertBase64UrlToBlob(urlData) {
let arr = urlData.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})
}
//上传//
async function upload(file) {
const img = await photoCompress(file);
const blob = await canvasDataURL(img, file.type, 1000, 1000);
}
function convertBase64UrlToBlob(urlData) {
let arr = urlData.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 canvasDataURL(path, file, callback) {
let img = new Image()
img.src = path
img.onload = function () {
const {width: originWidth, height: originHeight} = img;
// 默认按比例压缩
let w = img.width
let h = img.height
let quality = 0.7
// 默认图片质量为0.7
// 生成canvas
let canvas = document.createElement('canvas')
let ctx = canvas.getContext('2d')
// 创建属性节点
let anw = document.createAttribute('width')
anw.nodeValue = w
let anh = document.createAttribute('height')
anh.nodeValue = h
canvas.setAttributeNode(anw)
canvas.setAttributeNode(anh)
ctx.drawImage(img, 0, 0, w, h)
// 图像质量
console.log(`压缩之前的大小:${file.size / 1024}kb`)
if (file.size > 300 * 1024) {
quality = 0.3
}
// quality值越小,所绘制出的图像越模糊
let base64 = canvas.toDataURL('image/jpeg', quality)
callback(base64)
}
}
function photoCompress(file, objDiv) {
let reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = function () {
let result = this.result;
let img = canvasDataURL(result, file, objDiv)
}
}
document.getElementById("imageFile").addEventListener("change", function (e) {
upload(e);
})
function upload(e) {
const file = e.target.files[0];
photoCompress(file, function (base64Codes) {
let form = new FormData();
let bl = convertBase64UrlToBlob(base64Codes);
console.log(`压缩之后的大小:${bl.size / 1024}kb`)
});
}
script>
上传文件压缩
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>上传文件压缩title>head>
<body>
<div>
<h3>图片上传压缩h3>
<input type="file" id="file" placeholder="请上传图片" accept="image/*"/>
div>
body>
html>
<script>
document.getElementById("file").addEventListener("change", function (e) {
console.log("压缩前", e.target.files[0].size);
let result = e.target.files[0];
opload(result);
})
function readImg(file) {
return new Promise((resolve, reject) => {
const img = new Image();
const reader = new FileReader();
reader.onload = function (e) {
img.src = e.target.result;
console.log(e);
}
reader.onerror = function (e) {
reject(e);
}
reader.readAsDataURL(file);
img.onload = function () {
resolve(img);
}
img.onerror = function () {
reject(e);
}
})
}
//图片压缩
function compressImg(img, type, mx, mh) {
return new Promise((resolve, reject) => {
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
const {width: originWidth, height: originHeight} = img;
// 最大尺寸限制
const maxWidth = mx;
const maxHeight = mh;
// 目标尺寸
let targetWidth = originWidth;
let targetHeight = originHeight;
if (originWidth > maxWidth || originHeight > maxHeight) {
if (originWidth / originHeight > 1) {
// 宽图片
targetWidth = maxWidth;
targetHeight = Math.round(maxWidth * (originHeight / originWidth))
} else {
// 高图片
targetHeight = maxHeight;
targetWidth = Math.round(maxHeight * (originWidth / originHeight));
}
}
canvas.width = targetWidth;
canvas.height = targetHeight;
context.clearRect(0, 0, targetWidth, targetHeight);
// 图片绘制
context.drawImage(img, 0, 0, targetWidth, targetHeight);
canvas.toBlob(function (blob) {
console.log(blob);
resolve(blob);
}, type || 'image/png')
})
}
async function opload(file) {
const img = await readImg(file);
console.log(img);
const blob = await compressImg(img, file.type, 1000, 1000);
const formData = new FormData();
console.log("压缩后", blob);
formData.append("file", blob, `file_${Date.parse(new Date())}.jpg`);
}
script>
vue
@change="uploadImg($event)"/>