Base64 PNG数据到HTML5画布

Tom*_*nal 77 html5 base64 png canvas

我想将Base64编码的PNG图像加载到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>
Run Code Online (Sandbox Code Playgroud)

在Chrome 8中,我收到错误消息: Uncaught TypeError: Type error

在Firefox的Firebug中:"对象的类型与对象关联的参数的预期类型不兼容"代码:"17"

在那个base64中是我在GIMP中制作的5x5px黑色PNG方块,并在GNU/Linux程序base64中将其转换为base64.

小智 152

通过它的外观,你需要实际传递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";
Run Code Online (Sandbox Code Playgroud)
<canvas id="c"></canvas>
Run Code Online (Sandbox Code Playgroud)

我在chrome中尝试过它并且工作正常.

  • 应该在src之前设置onload事件.有时src可以立即加载,永远不会触发onload事件 (13认同)
  • 就像一个注释,如果你循环遍历一些画布,你可能想要将它改为`ctx.drawImage(this,0,0);`这样它可以确保图像变量引用正确的图像.很棒的答案! (8认同)
  • 很好的答案,但你确定每次都有效吗?我发现在设置`src`后立即绘制图像是错误的,因为你应该使用`onload`回调来确保图像已经完成加载.50%的测试失败,因为图像没有完成加载. (7认同)
  • 但是,如果`data:image /`长度很大,我们将得到`414(Request-URI Too Long` (3认同)

Joh*_*ohn 13

Jerryf的答案很好,除了一个缺陷.

应该在src之前设置onload事件.有时src可以立即加载,永远不会触发onload事件.

(就像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";
Run Code Online (Sandbox Code Playgroud)

  • @markE 这并不罕见。当浏览器缓存图像时,它会一直发生,例如在浏览器重新加载时。这发生在 c++ 程序中的 IE 引擎中。 (3认同)
  • 顺便说一句:我编辑了杰里夫的答案,但有人拒绝了。杰里夫(Jerryf)不可能如此,因为他的个人资料显示他最后一次登录是2014年。 (2认同)
  • **“有时src可以立即加载,并且永远不会触发onload事件。” **我认为这种情况的发生几乎从未发生过,但几乎没有,但是没有理由不养成在`之前设置`onload`的习惯。 src` ...我习惯这样做。 (2认同)