Skip to content

Commit c1f88bd

Browse files
author
ing
committed
feat(图片压缩工具): 添加PNG压缩支持并优化压缩流程
添加UPNG.js库以实现PNG格式的压缩,优化压缩流程以支持不同格式的处理
1 parent 9b491f6 commit c1f88bd

3 files changed

Lines changed: 21 additions & 3 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: 18 additions & 3 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;
@@ -263,8 +265,21 @@ <h1>图片压缩工具</h1>
263265
ctx.drawImage(image, 0, 0);
264266
const format = formatSelect.value;
265267
const quality = parseFloat(qualityInput.value);
266-
canvas.toBlob((blob) => {
267-
if (!blob) return;
268+
269+
const compressedUrlPromise = new Promise((resolve, reject) => {
270+
if (format === 'image/png' && typeof UPNG !== 'undefined') {
271+
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;
272+
const cnum = Math.floor(quality * 256);
273+
const compressed = UPNG.encode([imageData.buffer], canvas.width, canvas.height, cnum);
274+
const blob = new Blob([compressed], { type: 'image/png' });
275+
resolve(blob);
276+
} else {
277+
canvas.toBlob((blob) => {
278+
if (!blob) return;
279+
resolve(blob);
280+
}, format, quality);
281+
}
282+
}).then((blob) => {
268283
const url = URL.createObjectURL(blob);
269284
const previewImg = new Image();
270285
previewImg.onload = () => URL.revokeObjectURL(url);
@@ -274,7 +289,7 @@ <h1>图片压缩工具</h1>
274289
downloadLink.href = url;
275290
downloadLink.download = `compressed.${format.split('/')[1]}`;
276291
sizeInfo.textContent = `原图大小:${formatBytes(originalSize)} / 压缩后:${formatBytes(blob.size)}`;
277-
}, format, format === 'image/png' ? undefined : quality);
292+
});
278293
});
279294
</script>
280295
<script src="/assets/clicks.js" defer></script>

0 commit comments

Comments
 (0)