35

我正在尝试使用 drawImage 在画布元素上绘制半透明 PNG。但是,它将图像绘制为完全不透明的。当我查看正在加载的资源并在浏览器中加载实际的 PNG 时,它会显示透明度,但当我在画布上绘制它时,它不会。有任何想法吗?

这是代码:

drawing = new Image() 
drawing.src = "draw.png" 
context.drawImage(drawing,0,0);
4

5 回答 5

37

不要忘记为图像的加载事件添加事件侦听器。图像加载是在后台发生的,所以当 JavaScript 解释器到达 canvas.drawImage 部分时,很可能图像可能还没有加载,只是一个空的图像对象,没有内容。

drawing = new Image();
drawing.src = "draw.png"; // can also be a remote URL e.g. http://
drawing.onload = function() {
   context.drawImage(drawing,0,0);
};
于 2013-03-26T14:19:24.187 回答
9

Image您可以使用对象简单地插入任何透明图像:

var canvas=document.getElementById("canvas");
var context=canvas.getContext('2d');
var image=new Image();
image.onload=function(){
context.drawImage(image,0,0,canvas.width,canvas.height);
};
image.src="http://www.lunapic.com/editor/premade/transparent.gif";
<canvas id="canvas" width="500" height="500">your canvas loads here</canvas>

于 2016-04-25T13:36:57.903 回答
4

它应该可以正常工作,您确定您的图像真的是透明的,而不仅仅是背景中的白色吗?

这是一个在黑色矩形上绘制透明 PNG 的示例,以使您的代码基于以下内容:

http://jsfiddle.net/5P2Ms/

于 2012-01-23T19:49:31.313 回答
3

注意,如果您要使用canvas.toDataURL并将 mimetype 设置为 say gifor以外的任何内容png,则图像的透明部分将完全是黑色的。

drawing = new Image();
drawing.onload = function () {
    context.drawImage(drawing,0,0);
    var base64 = canvas.toDataURL('image/png', 1);
};
drawing.src = "draw.png";
于 2015-01-05T11:58:58.757 回答
3

如果您在渲染循环中绘制它,您需要确保首先运行context.clearRect( 0, 0, width, height ),否则您只是在每一帧的 png 上写入 png,最终将是不透明的。(但帧渲染速度很快,所以你不会用肉眼看到这一点。)

于 2013-03-04T08:52:49.690 回答