簡體   English   中英

將大量圖像繪制到html5畫布

[英]Drawing large array of images to html5 canvas

將大量圖片加載到html canvas元素時出現問題。 基本上,我想做的是獲取數組中每個圖像的一小部分(1px w,256px h),並在畫布上用所有這些較小的圖像組成一張新圖片。

當我運行此代碼時,將在屏幕上打印所有圖像。 但是,當我使用for循環運行它時,圖像保持白色。

function addToCanvas()
{   
    drawingCanvas = document.getElementById('myDrawingCanvas');
    context = drawingCanvas.getContext('2d');
        //for(imgNo=0;imgNo<256;imgNo++){
        var imgObj = new Image();
        imgObj.onload = function () {
            context.drawImage(imgObj, 0, 0, 1, 256, 0+(imgNo), 0, 1, 256);
        }
        imgObj.src = imgs[imgNo];
        imgNo++;    
        //}
}   

這是一個關閉問題,與畫布無關。 循環到位后,您將圍繞imgNo變量而不是其值創建一個閉合。 因此,當這些事件處理程序最終觸發時,循環結束的機會非常好,並且所有它們的imgNo等於256。

這是修復它的一種方法:

function addToCanvas()
{   
    drawingCanvas = document.getElementById('myDrawingCanvas');
    context = drawingCanvas.getContext('2d');
        for(imgNo=0;imgNo<256;imgNo++){
        var imgObj = new Image();
        imgObj.onload = (function(i) {
            return function () {
            context.drawImage(imgObj, 0, 0, 1, 256, 0+(i), 0, 1, 256);
            }
        })(imgNo);

        imgObj.src = imgs[imgNo];
        imgNo++;    
    }
}   

我正在創建一個返回函數的匿名函數,它返回事件處理程序。 然后立即使用imgNo的當前值調用它。 這導致它在新變量中捕獲其當前值,並將該新變量傳遞給事件處理程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM