我的画布有问题。 我可以用单个图像绘制画布,但我无法将每个画布与图像分开绘制。 - 如果数据只有一个图像,它工作正常,但数据有多个图像,它不起作用 你能救我吗?
<script>
var h_notepad = 500;
var w_notepad = 737;
var data = [
{dataImageURL: "1_sat_1.png"},
{dataImageURL: "1_sat_2.png"},
{dataImageURL: "1_sat_3.png"},
{dataImageURL: "1_sat_4.png"}
];
for(var i = 0; i < data.length ; i++){
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var img = new Image();
canvas.width = w_notepad;
canvas.height = h_notepad;
img.crossOrigin = 'anonymous';
img.width = w_notepad;
img.height = h_notepad;
console.log(img);
img.onload = function(){
ctx.drawImage(img, 0, 0, w_notepad, h_notepad);
};
img.src = data[i].dataImageURL;
$('body').append(canvas);
}
</script>
<html>
<head>
<meta charset="utf-8">
<title>DRAWING</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<meta charset="utf-8">
</head>
<body>
</body>
</html>
答案 0 :(得分:1)
问题是onload
是异步的。因此,在调用任何onload
函数之前,所有代码都会运行。这就是你的功能
img.onload = function(){
ctx.drawImage(img, 0, 0, w_notepad, h_notepad);
};
使用最新的ctx
并在此上下文中呈现所有图片。
您可以做的是使用同步函数范围覆盖此异步调用:
(function(ctx, img, w_notepad, h_notepad) {
img.onload = function(){
ctx.drawImage(img, 0, 0, w_notepad, h_notepad);
};
})(ctx, img, w_notepad, h_notepad);
这会隔离变量并保留值,直到您收到图像为止。
答案 1 :(得分:1)
我猜你只得到最后一个。 这是一个封闭问题。
当load
事件触发时,img
和ctx
仅引用最后创建的事件。
所以你在同一个画布上绘制data.length
时间。
为避免这种情况,您可以使用this
并将画布创建包装在onload处理程序中:
var imgs = ['http://lorempixel.com/200/300/', 'http://lorempixel.com/500/300/', 'http://lorempixel.com/200/100/'];
for (var i = 0; i < imgs.length; i++) {
var img = new Image();
var width = 500;
var height = 300;
img.onload = function() {
var c = document.createElement('canvas');
c.width = width;
c.height = height;
document.body.appendChild(c);
var ctx = c.getContext('2d');
ctx.drawImage(this, 0,0, width, height);
};
img.src = imgs[i];
}