Canvas 2D 圖像處理:瀏覽器端像素操作的原理與實務

技术架构(更新於 2026年5月23日)

Canvas 在圖像處理中的角色

瀏覽器提供了三種圖像處理路徑:

方案 效能 彈性 適用
CSS filter 高(GPU) 低(預設濾鏡) 簡單視覺效果
Canvas 2D 高(像素級) 壓縮、裁剪、格式轉換
WebGL 最高 高(需 shader) 複雜濾鏡、即時處理

工具庫的圖片工具(壓縮、裁剪、格式轉換、浮水印)全部基於 Canvas 2D API


基本處理流程

// 1. 載入圖片
const img = new Image();
img.src = URL.createObjectURL(file);
await img.decode();

// 2. 建立 Canvas 並繪製
const canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
const ctx = canvas.getContext('2d')!;
ctx.drawImage(img, 0, 0);

// 3. 匯出為目標格式
const blob = await new Promise<Blob>((resolve) =>
  canvas.toBlob(resolve, 'image/webp', 0.85) // 品質 85%
);

圖片壓縮原理

Canvas 壓縮本質是重新編碼

原始 PNG (2MB, 無損)
     ↓ drawImage 到 Canvas
     ↓ toBlob('image/jpeg', 0.8)
壓縮 JPEG (400KB, 有損 80% 品質)
格式 壓縮方式 典型壓縮率 透明度
JPEG 有損 DCT 60-80%
WebP 有損/無損 70-90%
PNG 無損 DEFLATE 10-30%
AVIF 有損/無損 80-95%

工具庫 圖片壓縮工具 支援批次 WebP/JPEG 壓縮,預設品質 85% 在體積與畫質間取得最佳平衡。


像素級操作

透過 ImageData 直接操作 RGBA 像素:

const imageData = ctx.getImageData(0, 0, width, height);
const data = imageData.data; // Uint8ClampedArray, 每 4 位元組 = 1 像素

for (let i = 0; i < data.length; i += 4) {
  // 灰階化
  const avg = (data[i] + data[i+1] + data[i+2]) / 3;
  data[i] = data[i+1] = data[i+2] = avg;
}

ctx.putImageData(imageData, 0, 0);

OffscreenCanvas 效能優化

主執行緒 Canvas 操作會阻塞 UI。OffscreenCanvas 可在 Worker 中執行:

// worker.ts
const offscreen = new OffscreenCanvas(width, height);
const ctx = offscreen.getContext('2d')!;
ctx.drawImage(imageBitmap, 0, 0);
const blob = await offscreen.convertToBlob({ type: 'image/webp', quality: 0.85 });
postMessage({ blob }, [blob]); // Transferable

批次處理 50 張圖片時,OffscreenCanvas + Worker 可將主執行緒阻塞從 10s 降至 0。


常見問題

為什麼壓縮後圖片變模糊?

JPEG/WebP 有損壓縮會遺失高頻細節。提高品質參數(0.9+)或使用 PNG/WebP 無損模式。

Canvas 有尺寸限制嗎?

大多數瀏覽器限制 Canvas 單邊最大 16384px,總面積約 268MP。超過此限制需要分塊處理。

如何處理 EXIF 方向資訊?

手機拍攝的照片可能含 EXIF Orientation。繪製前需讀取 EXIF 並旋轉 Canvas,否則圖片方向錯誤。工具庫 圖片格式轉換 會自動處理 EXIF。


總結

Canvas 2D 是瀏覽器端圖像處理的標準方案。理解 drawImage → toBlob 的編碼鏈路、ImageData 的像素操作,以及 OffscreenCanvas 的 Worker 卸載,是建構高效能圖片工具的核心能力。

本站提供瀏覽器本地工具,免註冊即可試用 →

#Canvas#图像处理#WebGL#像素操作#性能