Canvas ctx.drawImage无法使用透明PNG

时间:2014-09-27 22:41:48

标签: html5-canvas

当我使用透明PNG时,

ctx.drawImage()不起作用,但在使用常规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具有透明度并且背景被删除,则它无效。 你们有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分: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[]

}