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