You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
568tools/tools/webp2jpg-online/test/输出文件固定size.html

130 lines
4.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Page Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<input id="files" type="file" multiple />
<h4 id="t1"></h4>
<img id="img01" src="" alt="">
<canvas id="can"></canvas>
<h4 id="t2"></h4>
<img id="img02" src="" alt="">
<script>
/*
直接设置输出质量+-0.1来预测输出合适的size太死板了
尝试这样的算法
01.判断现有图片已经被压缩的比例
size /widhth * height
172112 / (500 * 500) = 0.688448
02.需要压缩的比例
size /widhth * height
60000 / (500 * 500) = 0.24
图片尺寸
*/
let input = document.getElementById("files")
let img01 = document.getElementById("img01")
let img02 = document.getElementById("img02")
input.addEventListener('change', function() {
console.log(this.files[0]);
let files = this.files
let img = new Image()
img.src = URL.createObjectURL(this.files[0])
img.onload = function() {
console.log(this);
// document.body.appendChild(this);
let _canvas = document.getElementById("can")
//处理缩放
let w = this.width
let h = this.height
// console.log(new Blob(img,'image/jpg'));
_canvas.setAttribute("width", w)
_canvas.setAttribute("height", h)
_canvas.getContext("2d").drawImage(this, 0, 0, w, h)
//转格式
console.log(_canvas);
// let base64_ok = _canvas.toDataURL(`image/${type}`, quality)
let s = 70000
let z1 = files[0].size / (this.width * this.height)
let z2 = s / (this.width * this.height)
let i = s / files[0].size
if (i > 1) i = 1
if (i < 0) i = 0.01
// let i = this.files[0].size / (this.width*this.height)
// setSizeFun(s, i)
setSizeFun(s, 1)
function setSizeFun(setSize, q) {
//本来的图片就很小了
if (files[0].size < setSize) {
// let b = new Blob([files[0]], {
// type: files[0].type
// })
// _canvas.toBlob(function(blob) {
// console.log( blob,'原样输出');
// }, `image/jpeg`, 1)
// return
}
let qu = q
let sizeAfter
_canvas.toBlob(function(blob) {
img02.src = URL.createObjectURL(blob)
sizeAfter = blob.size
console.log(blob, `setSize:`, setSize, `q:`, q);
//合格
if (setSize > sizeAfter && setSize * 0.9 < sizeAfter) {
console.log(blob, '✅✅✅✅');
} else {
// if (setSize < sizeAfter) qu = qu -0.005
// else qu = qu +0.005
// let yuan = Math.abs((qu * setSize / sizeAfter)-qu)
// let di = 0
// if (yuan<0.002) {
// di = 0.002
// }
qu = qu * setSize / sizeAfter
// if (qu < 0) {
// console.warn('没有合适的');
// return
// }
// if (qu > 1 && setSize > sizeAfter && setSize * 0.9 < sizeAfter) {
// console.log(blob, '最大输出质量✅✅✅✅');
// return
// }
if (qu > 1 || qu < 0) {
if (setSize > sizeAfter) {
console.log(blob, '最大输出质量✅✅✅✅');
} else {
console.warn('没有合适的');
}
return
}
console.log('继续');
setSizeFun(setSize, qu)
}
}, `image/jpeg`, q)
}
}
}, false)
</script>
</body>
</html>