DrawImageを使用して、キャンバス要素に半透明のPNGを描画しようとしています。ただし、イメージは完全に不透明として描画されます。読み込まれているリソースを見て、ブラウザで実際のPNGを読み込むと、透明度が表示されますが、キャンバスに描画すると表示されません。何か案は?
コードは次のとおりです。
drawing = new Image()
drawing.src = "draw.png"
context.drawImage(drawing,0,0);
画像のロードイベントにイベントリスナーを追加することを忘れないでください。画像の読み込みはバックグラウンドで行われるため、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);
};
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>
注:canvas.toDataURL
を使用する場合、gif
またはpng
以外のmimetypeを設定すると、画像の透明部分は完全に黒になります。
drawing = new Image();
drawing.onload = function () {
context.drawImage(drawing,0,0);
var base64 = canvas.toDataURL('image/png', 1);
};
drawing.src = "draw.png";
レンダーループで描画する場合は、最初にcontext.clearRect( 0, 0, width, height )
を実行する必要があります。そうでない場合は、フレームごとにpngの上にpngを書き込むだけで、最終的には不透明になります。 (ただし、フレームは高速でレンダリングされるため、肉眼ではこれを見ることができません。)
それはうまく機能するはずです、あなたの画像は本当に透明で、背景の白いだけではありませんか?
以下は、黒い長方形の上に透明なPNGを描画して、コードのベースを作成する例です。