Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTML画布呈现无序_Javascript_Html_Canvas - Fatal编程技术网

Javascript HTML画布呈现无序

Javascript HTML画布呈现无序,javascript,html,canvas,Javascript,Html,Canvas,我一直在开发一个小程序,它可以从几个层中生成一个完成的图像。我需要它都在一个画布上,以便我可以保存为一个单一的图像最终产品。但是,当我运行代码时,它会以随机顺序绘制层。如果有人能给我解释一下如何让图层按顺序渲染,我将不胜感激 function addimage(image, layer) { var canvas = document.getElementById('paper'), context = canvas.getContext('2d'); var img = new Image(

我一直在开发一个小程序,它可以从几个层中生成一个完成的图像。我需要它都在一个画布上,以便我可以保存为一个单一的图像最终产品。但是,当我运行代码时,它会以随机顺序绘制层。如果有人能给我解释一下如何让图层按顺序渲染,我将不胜感激

function addimage(image, layer) {
var canvas = document.getElementById('paper'),
context = canvas.getContext('2d');

var img = new Image();
img.src = "Images/" + image;
img.onload = function(){
    if (image == "Khundii_Agouti_Basic.png"){
        context.globalCompositeOperation = "multiply";
    } else if (image == "Khundii_Agouti_Cinnamon.png"){
        context.globalCompositeOperation = "overlay";
    } else if (layer == "pattern1"){
        context.globalCompositeOperation = "overlay";
    } else {
        context.globalCompositeOperation = "source-over";
    }
    context.drawImage(img, 0, 0, 500, 500);
}
}
上面是将图像添加到画布的代码

addimage(baseImage);
if (pattern1 == true)
    addimage(pattern1Image, "pattern1");
if (pattern2 == true)
    addimage(pattern2Image);
if (tint1 == true)
    addimage(tint1Image);
if (tint2 == true)
    addimage(tint2Image);
if (agouti == true)
    addimage(agoutiImage);
addimage(maneImage);
addimage(eyeImage);

addimage("Khundii_Line_Black.png");
这就是它的名字


如果您想了解更多信息,可以找到所有代码。

这种看似随机的排序背后的原因是渲染图像之前的加载时间。由于加载是一个异步过程,计算机将遍历所有图像,并开始将它们全部加载到一行中。根据图像的不同,与最后一个图像相比,计算机加载第一个图像可能需要更多的时间

既然我们了解了这个问题,那么潜在的解决方案是什么?最糟糕的可能是同步加载图像。我将在这里留下一个参考,但这样做几乎从来都不是一个好主意。更好的方法是为addImage函数使用回调函数。像这样的东西可以达到目的:

function addimage(image, layer, callback) {
    var canvas = document.getElementById('paper'),
    context = canvas.getContext('2d');

    var img = new Image();
    img.src = "Images/" + image;
    img.onload = function(){
        if (image == "Khundii_Agouti_Basic.png"){
            context.globalCompositeOperation = "multiply";
        } else if (image == "Khundii_Agouti_Cinnamon.png"){
            context.globalCompositeOperation = "overlay";
        } else if (layer == "pattern1"){
            context.globalCompositeOperation = "overlay";
        } else {
            context.globalCompositeOperation = "source-over";
        }
        context.drawImage(img, 0, 0, 500, 500);
        callback();
    }
}

要使用此功能,只需将您希望在之后运行的所有代码放入回调函数。

您可以发布HTML,或者为人们设置一个代码片段以进行故障排除吗?这将有助于我们重现问题并找到解决方案。谢谢问题是,我需要连续多次调用addImage函数,因此对于这样的回调,我必须不断嵌套不同的回调。