2010-12-10 5 views
53

Я хочу загрузить изображение PNG, закодированное в Base64, в элемент canvas. У меня есть этот код:Base64 PNG data to HTML5 canvas

<html> 
<head> 
</head> 
<body> 
<canvas id="c"></canvas> 
<script type="text/javascript"> 

var canvas = document.getElementById("c"); 
var ctx = canvas.getContext("2d"); 

data = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oMCRUiMrIBQVkAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12NgoC4AAABQAAEiE+h1AAAAAElFTkSuQmCC"; 

ctx.drawImage(data, 0, 0); 

</script> 
</body> 
</html> 

В Chrome 8 я получаю ошибку: Uncaught TypeError: Type error

И в Firebug этом Фирефокса: «Тип объекта несовместима с ожидаемым типом параметра, связанного с объектом "code:" 17 "

В том, что base64 представляет собой квадрат PNG размером 5x5 пикселей, который я сделал в GIMP, и превращаю его в base64 в базовую программу GNU/Linux64.

ответ

107

Взглядами ему нужно на самом деле передать DrawImage объект изображения, как так

var canvas = document.getElementById("c"); 
 
var ctx = canvas.getContext("2d"); 
 

 
var image = new Image(); 
 
image.onload = function() { 
 
    ctx.drawImage(image, 0, 0); 
 
}; 
 
image.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oMCRUiMrIBQVkAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12NgoC4AAABQAAEiE+h1AAAAAElFTkSuQmCC";
<canvas id="c"></canvas>

Я пробовал в хроме и она отлично работает.

+4

Хороший ответ, но вы уверены, что это работает каждый раз? Мне не удалось создать изображение сразу после установки `src`, потому что вы должны использовать обратный вызов` onload`, чтобы гарантировать, что изображение закончило загрузку. 50% моих тестов не удалось, потому что изображение не закончило загрузку. – 2012-09-06 23:05:24

+0

Вау! Взрыв из прошлого :). Вы совершенно правы. Если вы вызываете drawImage сразу после того, как вы установили src изображения, вы, вероятно, столкнетесь с проблемами, и в зависимости от вашей ситуации вы, скорее всего, захотите использовать onload, чтобы убедиться, что изображение загружено, прежде чем пытаться выполнить рендеринг это к холсту. Вышеприведенный код был скорее примером того, что drawImage действительно требует объекта изображения и как передать его ему. – Jerryf 2012-09-07 11:00:39

11

Ответ Джеррифа в порядке, за исключением одного изъяна.

The onload event should be set before the src. Sometimes the src can be loaded instantly and never fire the onload event.

(Как Totty.js указал.)

var canvas = document.getElementById("c"); 
var ctx = canvas.getContext("2d"); 

var image = new Image(); 
image.onload = function() { 
    ctx.drawImage(image, 0, 0); 
}; 
image.src = "data:image/ png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oMCRUiMrIBQVkAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12NgoC4AAABQAAEiE+h1AAAAAElFTkSuQmCC";