drawImage in JavaScript (Canvas)
drawImage in JavaScript (Canvas)
我有一个图像对象数组,其中包含所有必要的信息,如路径、x、y、w、h。现在我想在画布上循环绘制所有这些图像。。但当我这样做的时候,它只画第一个图像。这是代码:
for(var i=0; i<shapes.length; i++)
{
var A = shapes.pop();
if(A.name == 'image' && A.pageNum == pNum)
{
var img = new Image();
img.src = A.path;
img.onload = function() {
context.drawImage(img, A.x, A.y, A.w, A.h);
}
}
}
我检查了形状数组中的所有信息。。。在if条件中,在调用drawImage函数之前,每个图像的所有信息都是正确的,但由于某种奇怪的原因,它不显示除数组中的"最后一个"(最后弹出的那个)之外的图像
您的图像加载代码有错误。
每个图像都需要一段时间才能加载,然后您已经用另一个新的图像()覆盖了var img;
这里有一个图像加载器的例子,它只在所有图像都已加载并准备好绘制后才执行:
【警告:未经测试的代码——可能需要进行一些调整!】
// image loader
var imageURLs=[]; // put the paths to your images in this array
var imagesOK=0;
var imgs=[];
imageURLs.push("");
loadAllImages(start);
function loadAllImages(callback){
for (var i=0; i<imageURLs.length; i++) {
var img = new Image();
imgs.push(img);
img.onload = function(){
imagesOK++;
if (imagesOK>=imageURLs.length ) {
callback();
}
};
img.onerror=function(){alert("image load failed");}
img.crossOrigin="anonymous";
img.src = imageURLs[i];
// note: instead of this last line, you can probably use img.src=shapes[i].path;
}
}
function start(){
// the imgs[] array holds fully loaded images
// the imgs[] are in the same order as imageURLs[]
for(var i=0;i<shapes.length;i++){
var shape=shapes[i];
context.drawImage(imgs[i],shape.x,shape.y,shape.w,shape.h);
}
}
这是某种闭包的问题。。。比如在加载图像之前完成循环之类的。对我有效的解决方案是将所有图像加载代码放在一个单独的函数中,并从循环中调用该函数:
if(A.name == 'image' && A.pageNum == pNum)
{
displayImage(A.path, A.x, A.y, A.w, A.h);
}
function displayImage(path, x, y, w, h)
{
var img = new Image();
img.src = path;
img.onload = function() {
context.drawImage(img, x, y, w, h);
}
}
我不明白为什么要使用pop()来获取对象数据。相反,您可以使用shapes[i]表示法访问每个对象,并且作为奖励,在每个对象中存储图像句柄:
for(var i=0; i<shapes.length; i++)
{
if(shapes[i].name == 'image' && shapes[i].pageNum == pNum)
{
shapes[i].img = new Image();
shapes[i].img.src = shapes[i].path;
shapes[i].img.onload = function() {
context.drawImage(shapes[i].img, shapes[i].x, shapes[i].y, shapes[i].w, shapes[i].h);
}
}
}
相关文章:
- 加速我的复杂函数绘图仪(canvas+javascript)
- Html5 Canvas Javascript使我的网页链接没有响应
- 使用canvas+javascript进行2D碰撞检测
- 从 Canvas Javascript 获取图像
- HTML 5 canvas JavaScript rain animation(如何高效轻松地实现!).
- Canvas/JavaScript-鼠标单击时翻转正方形的颜色
- html and Svg to Canvas javascript
- Html5 Canvas Javascript libraries?
- 剪切倾斜线条canvas/Javascript
- 这是一款基于html5 canvas (javascript API)的开源游戏
- HTML-Canvas - javascript -动画/绘图
- Html5-canvas javascript绘制线与滑块
- 在HTML5 (canvas + JavaScript)中是否有类似的graphstream (Java) ?
- Facebook Canvas JavaScript链接不起作用
- ajax调用后重新加载canvas javascript
- Canvas JavaScript -检查圆形是否与pixeldata碰撞
- CORS issue with HTML5 canvas, javascript
- 隐藏鼠标光标,当它'在HTML5 Canvas Javascript
- html5 canvas - JavaScript-将鼠标X和Y位置存储在变量中,并在鼠标移动时不断更新它们
- 在canvas javascript上绘制10,000个对象