【问题标题】:DrawImage on a dynamically created canvas动态创建的画布上的 DrawImage
【发布时间】:2015-04-05 08:33:34
【问题描述】:

首先see this Fiddle

我想动态创建一个画布并将其附加到特定的 DIV 并在画布上绘制一个内联 svg。但没有按预期工作。

var randn = '1';

    function createme(){
        alert("completed 0");
          var crCavs = $('<canvas />',{ id : 'mycanvs'+randn })

          $('#album').append(crCavs);
        alert("completed 1");

          var svg2 =document.getElementById('sVgsource'+randn).outerHTML,
              vms =document.getElementById('mycanvs'+randn), // target canvas
              ctx2 =vms.getContext('2d');

          //callback
          svgToImage(svg2, function(img2){
            vms.width =$('#sVgsource'+randn).width();
            vms.height =$('#sVgsource'+randn).height();
            alert("completed 3");
            ctx2.drawImage(img2, 30, 40);
              alert("completed 4");
          }

          function svgToImage(svg2, callback) {
            var nurl = "data:image/svg+xml;utf8," + encodeURIComponent(svg2),
                img2 = new Image;
            //invoke callback
              callback(img2);

              img2.src = nurl;
              alert("completed 2");
          }
    }
    createme();

【问题讨论】:

    标签: javascript html canvas


    【解决方案1】:

    您缺少svgToImage() 函数的结束括号:

    svgToImage(svg2, function(img2) {
        vms.width = img2.width;
        vms.height = img2.height;
        alert("completed 3");
        ctx2.drawImage(img2, 0, 0);
          alert("completed 4");
    }); // <-- here
    

    还有一些其他的问题:

    只需重用画布元素:

    var canvCrtrWrp = $('<canvas />',{ id : 'mycanvs'+randn })
    
    ...
    var vms = canvCrtrWrp[0];  // index 0 is the actual canvas element
    

    您还可以使用画布上生成的图像的宽度:

    svgToImage(svg2, function(img2) {
        vms.width = img2.width;
        vms.height = img2.height;
        ...
    

    记得对图像使用onload 处理程序(它已从原始代码中删除)。如果不是图像元素,则在没有任何实际图像数据的情况下传回(需要一些时间来加载、解码等):

     function svgToImage(svg2, callback) {
         var nurl = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(svg2),
             img2 = new Image;
    
         img2.onload = function() {
            callback(this);
         }
         ...
    

    等等

    更新fiddle

    【讨论】:

    • 谢谢。见jsfiddle.net/z769z7af/5alert("completed 1")之后为什么canvas消失了?
    • 我调整了画布的高度和宽度,使画布不再消失。见jsfiddle.net/z769z7af/6 但我不知道为什么drawImage(); 不起作用?画布上似乎什么都没有?也许这个问题也可能与我之前的评论有关?回调函数中是否缺少某些东西?
    • @Beki 您已为图像删除了 onload 处理程序。 jsfiddle.net/epistemex/z769z7af/7
    • 谢谢/我也试过了,但添加 onload 处理程序并不能解决问题。就像你的小提琴一样,它只显示背景颜色。画布是空的。
    • @Beki i.imgur.com/Ahh3vuS.png 我不会为你做更多的调试 :) 如果你仔细阅读,你应该能够使用提供的代码来解决问题。或者回到原来的代码重新开始:stackoverflow.com/questions/29369403/…
    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2012-11-30
    • 2015-05-10
    • 2019-12-29
    • 2016-06-15
    相关资源
    最近更新 更多