2024-02-22 02:28:25
JS实现图片压缩的核心方案是利用Canvas API,通过绘制图片到Canvas并导出为指定质量的图片完成压缩。 以下是具体实现方法及优化建议:
一、Canvas API实现图片压缩核心步骤:将图片绘制到Canvas,通过toDataURL()导出压缩后的图片。
function compressImage(imageFile, quality, callback) { const reader = new FileReader(); reader.onload = function(event) { const img = new Image(); img.src = event.target.result; img.onload = function() { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0, img.width, img.height); const compressedDataUrl = canvas.toDataURL('image/jpeg', quality); // 输出JPEG格式 const blob = dataURLToBlob(compressedDataUrl); callback(blob); }; }; reader.readAsDataURL(imageFile);}// Data URL转Blob对象(兼容性处理)function dataURLToBlob(dataURL) { const parts = dataURL.split(';base64,'); const contentType = parts[0].split(':')[1]; const raw = window.atob(parts[1]); const rawLength = raw.length; const uInt8Array = new Uint8Array(rawLength); for (let i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i); } return new Blob([uInt8Array], { type: contentType });}// 使用示例const inputElement = document.getElementById('imageInput');inputElement.addEventListener('change', function(event) { const imageFile = event.target.files[0]; compressImage(imageFile, 0.7, function(compressedBlob) { console.log('压缩后的Blob:', compressedBlob); const compressedImageUrl = URL.createObjectURL(compressedBlob); document.getElementById('compressedImage').src = compressedImageUrl; });});关键参数:

分场景调整参数:
色彩丰富的照片:可降低质量至0.6~0.8。
包含文本/线条的图像:建议质量≥0.9,避免锯齿。
A/B测试:
对同一张图片尝试不同质量参数,对比视觉效果与文件大小。
使用高级库:
如pica库支持更精细的压缩控制,包括分辨率调整和插值算法。
WebAssembly (WASM) 压缩库:
例如MozJPEG和WebP encoder,通过C/C++实现高性能压缩,但需权衡项目复杂性。
浏览器内置Image API:
ImageBitmap接口可优化图像数据,但需测试兼容性。
渐进式JPEG:
图片加载时逐渐显示,改善慢网体验,需工具转换格式。
图片格式优化:
WebP格式压缩率高于JPEG/PNG,但需检查浏览器支持情况。

选择合适算法:
JPEG适合照片,PNG适合透明背景或线条图。
控制压缩率:
避免质量低于0.6(照片)或0.8(线条图)。
预处理原始图片:
锐化、降噪可提升压缩后质量。
使用专业工具:
如Squoosh、TinyPNG等提供精细参数调整。
客户端压缩优势:
减少网络传输,提升响应速度。
缺点:增加低端设备计算负担。
服务器端压缩优势:
统一压缩策略,保证质量一致性。
缺点:增加服务器压力。
最佳实践:
客户端初步压缩(如质量0.7),上传后服务器根据设备/网络生成适配版本。
示例:客户端压缩后上传WebP,服务器生成不同尺寸的响应式图片。

总结:客户端图片压缩需结合Canvas API、质量参数优化、格式选择及服务端协同,根据场景权衡性能与质量。