Canvas 的 width 被指定時,畫布內容和繪圖狀態都會重設。數值與原本相同也不例外,目前路徑及 fillStyle 等屬性仍會重設。準備輸出圖片時,把尺寸設定放在樣式與繪圖操作之前,可以避免剛設定的狀態被清掉。
例如先將 fillStyle 設為白色,再指定 canvas.width,後續填色就不會繼續使用剛才的白色設定。如果背景顏色不對,除了檢查填色呼叫,也要查看前面是否重新指定過尺寸。
先決定 width 與 height,再設定繪圖需要的轉換、合成模式和填色樣式,最後繪製背景與圖片。把尺寸設定集中處理,除錯時就能找到明確的重設位置。
如果只重畫相同尺寸的內容,可以先比較目前與目標尺寸,有差異才指定新值。這樣也會保留舊的繪圖狀態,因此重畫函式仍須明確設定它依賴的狀態。沒有改尺寸,不表示目前狀態就是預設值。
測試除了涵蓋尺寸改變,也要包含再次指定相同 width。檢查背景和圖片是否重新畫出,以及樣式設定是否排在尺寸指定之後。需要保留像素內容時,應另外保存與寫回;繪圖屬性也要另外管理。
參考 MDN 的 width 說明:https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/width
作者關係揭露:我參與影像處理專案 Morphio:https://morphio.online/ 。本文說明 Canvas API 的初始化行為,不代表任何服務已採用特定實作。