這篇的重點,使用canvas優化照片大小與Blob VS DataURL
前端照片優化選項
- 縮小照片尺寸
- 降低畫質
- 檔案格式轉換:轉為 JPEG 或 WebP。JPEG 可能會有一些失真,但文件較小;WebP 品質更好,但只有 98% 的瀏覽器支持
縮小照片尺寸
使用
<canvas>
元素來等比例縮小照片。以下是一個簡單的 JavaScript 範例:降低畫質和檔案格式轉換
使用
toDataURL()
或 toBlob()
方法來降低畫質或轉換文件格式。toBlob
- 非同步操作:
toBlob
是一個異步方法,它接受一個回調函數,該回調函數將在圖像數據準備好後被調用。
- 效能和內存使用:通常來說,
toBlob
更為高效,因為它直接生成一個 Blob 對象,而不需要先將圖像數據轉換為 Base64 字符串。
- 檔案格式支持:它允許你選擇輸出的圖像格式,包括
image/png
、image/jpeg
和image/webp
。
- 品質調整:你可以指定一個品質參數,這是一個介於 0 和 1 之間的數字,用於控制輸出圖像的品質。
toDataURL
- 同步操作:
toDataURL
是一個同步方法,會立即返回一個包含圖像數據的 Base64 編碼的 URL 字符串。
- 效能和內存使用:生成 Base64 字符串可能會增加內存使用量和CPU負擔。
- 檔案格式支持:通常僅支持
image/png
和image/jpeg
。
- 品質調整:也可以指定一個品質參數。
總結,
toBlob
通常在處理大文件或需要更多格式支持時更為高效,而 toDataURL
則提供了一種更簡單但可能較低效的方式來獲取圖像數據。選擇哪一個取決於你的具體需求和應用場景。- Data URL: 通常以
"data:"
開頭,例如data:image/png;base64,...
,可以表示檔案數據
- Blob URL: 通常以
"blob:"
開頭,例如blob:http://...
讀取file:
使用
FileReader
的 readAsDataURL()
方法會讓 reader.result
包含一個表示檔案數據的 Data URL。這個 Data URL 是一個 base64 編碼的字符串,您可以直接將它用於圖像預覽或其他用途。當
reader.onloadend
事件觸發後,reader.result
就會包含這個 Data URL。您可以確信 reader.result
這時是一個 Data URL,不是 Blob URL