Skip to content

Commit 3209f87

Browse files
authored
Merge pull request #11 from ing0928/main
fix: 修复图片压缩工具,压缩后无法下载
2 parents 0aa1b17 + c63187e commit 3209f87

3 files changed

Lines changed: 27 additions & 4 deletions

File tree

assets/vendor/pako/pako.min.js

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

assets/vendor/upng-js/UPNG.min.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/image-compressor/app.html

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
<meta name="viewport" content="width=device-width, initial-scale=1.0">
77
<title>图片压缩工具</title>
88
<link rel="canonical" href="https://www.htmls.dev/tools/image-compressor/app.html">
9+
<script src="https://cdn.jsdelivr.net/npm/pako@2.1.0/dist/pako.min.js" onerror="this.onerror=null;this.src='/assets/vendor/pako/pako.min.js';"></script>
10+
<script src="https://cdn.jsdelivr.net/npm/upng-js@2.1.0/UPNG.min.js" onerror="this.onerror=null;this.src='/assets/vendor/upng-js/UPNG.min.js';"></script>
911
<style>
1012
:root {
1113
--accent: #22c55e;
@@ -220,6 +222,7 @@ <h1>图片压缩工具</h1>
220222
const downloadLink = document.getElementById('download');
221223
let image = new Image();
222224
let originalSize = 0;
225+
let currentBlobUrl = null;
223226

224227
function formatBytes(bytes) {
225228
if (!bytes) return '--';
@@ -263,18 +266,35 @@ <h1>图片压缩工具</h1>
263266
ctx.drawImage(image, 0, 0);
264267
const format = formatSelect.value;
265268
const quality = parseFloat(qualityInput.value);
266-
canvas.toBlob((blob) => {
267-
if (!blob) return;
269+
270+
const compressedUrlPromise = new Promise((resolve, reject) => {
271+
if (format === 'image/png' && typeof UPNG !== 'undefined') {
272+
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;
273+
const cnum = Math.floor(quality * 256);
274+
const compressed = UPNG.encode([imageData.buffer], canvas.width, canvas.height, cnum);
275+
const blob = new Blob([compressed], { type: 'image/png' });
276+
resolve(blob);
277+
} else {
278+
canvas.toBlob((blob) => {
279+
if (!blob) return;
280+
resolve(blob);
281+
}, format, quality);
282+
}
283+
}).then((blob) => {
284+
// 释放之前的 blob URL
285+
if (currentBlobUrl) {
286+
URL.revokeObjectURL(currentBlobUrl);
287+
}
268288
const url = URL.createObjectURL(blob);
289+
currentBlobUrl = url;
269290
const previewImg = new Image();
270-
previewImg.onload = () => URL.revokeObjectURL(url);
271291
previewImg.src = url;
272292
preview.innerHTML = '';
273293
preview.appendChild(previewImg);
274294
downloadLink.href = url;
275295
downloadLink.download = `compressed.${format.split('/')[1]}`;
276296
sizeInfo.textContent = `原图大小:${formatBytes(originalSize)} / 压缩后:${formatBytes(blob.size)}`;
277-
}, format, format === 'image/png' ? undefined : quality);
297+
});
278298
});
279299
</script>
280300
<script src="/assets/clicks.js" defer></script>

0 commit comments

Comments
 (0)