使用image.onload将多个图像绘制到画布上

问题描述 投票:6回答:1

尝试在画布上绘制大型2D图像阵列时遇到问题。使用一个单独的程序,我要获取一个大图像文件,并将其分解成更小的,均匀的碎片。我使用2D数组表示图像的“网格”,理想情况下,当我为网格中的每个元素分配src时,一旦准备好,该图像就会在画布上绘制到适当的位置。但是,我的代码无法正常工作。

var grid = new Array()  
/*grid is set to be a 2D array of 'totalRows' rows and 'totalCols' columns*/  

/*In the following code, pieceWidth and pieceHeight are the respective height/widths  
of each of the smaller 'pieces' of the main image. X and Y are the coordinates on  
the canvas that each image will be drawn at. All of the images are located in the  
same directory (The src's are set to http://localhost/etc), and each individual  
filename is in the form of name(row*totalRows + col).png, ex, traversing the 2D  
array left to right top to bottom would give image1.png, image2.png, etc*/  

for (var row = 0; row < totalRows; row++)  
    {  
        for (var col = 0; col < totalCols; col++)  
        {  
            grid[row][col] = new Image();  
            var x = col * pieceWidth;  
            var y = row * pieceHeight;  
            grid[row][col].onload = function () {ctx.drawImage(grid[row][col], x, y);};  
            grid[row][col].src = "oldimagename" +  ((row * totalRows) + col) + ".png";  
        }  
    }  

我已经尝试在Opera,Firefox,Chrome和Safari中运行此代码。 onload事件在Opera,Chrome和Safari中根本不会触发(我在onload函数中放置了一个警报,但从未出现过)。在Firefox中,仅触发FIRST图像(grid [0] [0])的onload事件。但是,我注意到,如果在设置当前元素的src之后立即放置警报,则会触发Firefox中的每个onload事件,并绘制整个图像。理想情况下,我希望此功能可在所有4种浏览器中使用(我认为IE无法正常工作,因为它不支持Canvases),但我只是不知道发生了什么。任何帮助/输入表示赞赏。

javascript html canvas dom-events onload
1个回答
10
投票

我认为问题在于您没有将变量放入闭包中。更改此行:

grid[row][col].onload = function () {ctx.drawImage(grid[row][col], x, y);};

收件人

grid[row][col].onload = function () {window.alert('row:' + row + ' col:' + col);};

并且what you'll see是您的警报在每次调用时为row和col返回相同的值。您需要获取这些variables wrapped in a closure,以便您的函数处理值而不是引用:

var drawCanvasImage = function(ctx,grid,row,col,x,y) {
    return function() {
        ctx.drawImage(grid[row][col], x, y);
    }
}

然后做:

grid[row][col].onload = drawCanvasImage(ctx,grid,row,col,x,y);

This example page在Firefox和Chrome中对我有效。

© www.soinside.com 2019 - 2024. All rights reserved.