【问题标题】:Canvas ctx.drawImage is not working with a transparent PNGCanvas ctx.drawImage 不适用于透明 PNG
【发布时间】:2014-09-28 07:17:54
【问题描述】:

ctx.drawImage() 在我使用透明 PNG 时不起作用,但在我使用常规 PNG 时起作用。

 var context = document.getElementById("canvas").getContext('2d');
 ....
 function draw(img, x, y){
   context.drawImage(img, x, y);
 }

 //actulaly there is loop here, but for simplicity I put only this.
 var img = new Image();
 img.src = "images/a.png";
 img.onload = draw(img, 10, 10); 

如果我使用常规的 PNG 图像,它可以工作,但如果使用具有透明度且背景被删除的 PNG,它就无法工作。 你们知道为什么吗?谢谢。

【问题讨论】:

    标签: html5-canvas


    【解决方案1】:

    img.onload 接受函数引用而不是函数调用。

    这样做:

    img.onload=function(){draw(img,10,10);}
    

    如果需要加载很多图片,这里有一个图片预加载器,在调用 start() 函数之前完全加载所有图片:

    // image loader
    
    // put the paths to your images in imageURLs[]
    var imageURLs=[];  
    // push all your image urls!
    imageURLs.push("");
    imageURLs.push("");
    
    // the loaded images will be placed in images[]
    var imgs=[];
    
    var imagesOK=0;
    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];
        }      
    }
    
    function start(){
    
        // the imgs[] array now holds fully loaded images
        // the imgs[] are in the same order as imageURLs[]
    
    }
    

    【讨论】:

    • 还是不行。函数 draw() 被调用了 11550 次(我在那里有一个 console.log),但它什么也没画。有趣的是控制台中也没有错误。如果我使用另一个没有透明度的 PNG 文件,它确实可以工作。
    • Ahhh...11500 次循环...好吧,如果 var img 在循环内,那么循环的下一个交互很可能会在第一个循环之前替换 img img 的迭代已满载。因此,请确保在第一次加载完成之前不会执行循环的下一次迭代。可能不相关,但将 .onload 放在 .src 之前(以防万一)。
    • 是的,它在一个循环中。你可能是对的,因为现在“var img”在循环中,它不能与之前工作的图像一起工作。我试试看,谢谢。
    • 也感谢您提供的代码。是的,这就是问题所在,我需要绘制许多不同的图像。谢谢你的代码。
    • 非常感谢markE。现在我了解了您的代码的真正价值。由于我来自java背景,我对回调概念并不熟悉。
    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 2023-04-08
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2011-03-14
    • 2013-11-21
    相关资源
    最近更新 更多