Рисование PNG на элементе холста - не показывает прозрачность - PullRequest
25 голосов
/ 23 января 2012

Я пытаюсь использовать drawImage, чтобы нарисовать полупрозрачный PNG на элементе canvas. Тем не менее, он рисует изображение полностью непрозрачным. Когда я смотрю на загружаемый ресурс и загружаю фактический PNG в браузере, он показывает прозрачность, но когда я рисую его на холсте, это не так. Есть идеи?

Вот код:

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

Ответы [ 5 ]

28 голосов
/ 26 марта 2013

Не забудьте добавить прослушиватель событий к событию загрузки изображения. Загрузка изображений - это то, что происходит в фоновом режиме, поэтому, когда интерпретатор 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);
};
5 голосов
/ 25 апреля 2016

Вы можете просто вставить любое прозрачное изображение, используя 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>
3 голосов
/ 05 января 2015

Примечание: если вы должны были использовать canvas.toDataURL, и вы установили mimetype на что-либо, кроме, скажем, gif или png, прозрачные части изображения будут полностью черными.

drawing = new Image();
drawing.onload = function () {
    context.drawImage(drawing,0,0);
    var base64 = canvas.toDataURL('image/png', 1);
};
drawing.src = "draw.png";
3 голосов
/ 04 марта 2013

Если вы рисуете его в цикле рендеринга, вам нужно сначала запустить context.clearRect( 0, 0, width, height ), иначе вы просто записываете png поверх png в каждом кадре, что в конечном итоге будет непрозрачным. (Но кадры отображаются быстро, поэтому вы не увидите этого невооруженным глазом.)

3 голосов
/ 23 января 2012

Должно работать нормально, вы уверены, что ваше изображение действительно прозрачное, а не просто белое на заднем плане?

Вот пример рисования прозрачного PNG над черным прямоугольником, чтобы основать ваш код на:

http://jsfiddle.net/5P2Ms/

...