在 HTML5 Canvas 中使用 drawImage 繪製多張圖片時,確保載入完成與正確疊加

在 HTML5 的 Canvas 元素中使用 drawImage() 方法繪製圖片時,若有多張圖片需依序疊加顯示,確保每張圖片都已完整載入至記憶體是極為重要的。若在圖片尚未載入完成時就嘗試繪製,drawImage() 將無法正確顯示圖片,導致畫面缺失。


本文範例示範如何透過 Image 物件的 onload 事件處理機制,確保兩張圖片載入完成後再繪製,並正確疊加其圖層順序。


範例說明:

假設要繪製兩張圖片:

t1.png:儲存在雲端。

t2.png:與 HTML 檔案位於同一目錄(本地)。


範例程式碼:

<body>

  <canvas id="canvas_a" width="300" height="300" style="border: 1px solid"></canvas>


  <script>

    const canvas = document.getElementById("canvas_a");

    canvas.style.position = "absolute";


    const ctx = canvas.getContext("2d");


    const test1 = new Image(); // 第一張圖片(雲端)

    const test2 = new Image(); // 第二張圖片(本地)


    test1.src = "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMkzrhtoGf0Tml7POi9w7s9oSt4teDe0S4nxpMLmT5qXh8MQi136-lEBWQRQvoPkTvj_ta4KPy2U9GDvVm1zL-IHIzivSnf7xsJ0DcLQJUMUDkAOzTwXk6_b5-J3uM56zySXGJoEmQrMw/s1600/t1.png";

    test2.src = "t2.png";


    // 圖片載入追蹤邏輯

    let imagesLoaded = 0;

    const totalImages = 2;


    const imageLoadedHandler = () => {

      imagesLoaded++;

      if (imagesLoaded === totalImages) {

        // 所有圖片載入完成後,按順序繪製

        ctx.drawImage(test1, 0, 0); // test1 為底層

        ctx.drawImage(test2, 0, 0); // test2 疊加於上

      }

    };


    // 綁定 onload 事件

    test1.onload = imageLoadedHandler;

    test2.onload = imageLoadedHandler;

  </script>

</body>


結論:

要在 Canvas 中正確地顯示多張疊加的圖片,務必使用 Image 物件的 onload 事件來監控圖片載入狀態。這不僅可以避免圖片未載入就繪製的錯誤,也能確保圖層疊加順序正確。






留言