【问题标题】:I cannot get Base64 string from a canvas我无法从画布中获取 Base64 字符串
【发布时间】:2014-12-08 12:39:24
【问题描述】:

我一直在尝试从画布中获取 Base64 字符串。但是我不能。 下面的代码什么都不做。它应该将图像插入到 document.body 中。另一方面,我尝试获取 base64 字符串并转换图像。但我又不能。

我该怎么办?

http://jsfiddle.net/27hdp4y6/1/

var image1 = new Image();
image1.src = "http://www.w3.org/html/logo/downloads/HTML5_Logo_128.png";
var image2 = new Image();
image2.src = "http://prismitsolutions.com/images/icons/css3.png";

var canvas = document.createElement('canvas');
canvas.width = 220;
canvas.height= image1.height;
var context = canvas.getContext("2d");

image1.onload = function() {

   context.drawImage(image1, 0, 0); 
   context.drawImage(image2, 80, 0);      
};

var base64 = canvas.toDataURL('image/png');

var img = document.createElement('img');
img.src=base64;
document.body.appendChild(img);

//document.body.appendChild(canvas); 

【问题讨论】:

    标签: javascript canvas base64


    【解决方案1】:

    您将获得一个空画布,因为您的代码不会等待图像正确加载。图片加载是异步的。

    您还假设图像 1 完成后两个图像都已加载。

    • 您需要等待两个图像加载
    • 在绘制图像后,从内部加载处理程序(或调用另一个函数)调用toDataURL()
    • 您正在尝试从可能尚未加载的图像中设置画布的高度。在加载图像时设置它
    • 您可能会在此处触发 CORS 限制,请确保图像与页面存在于同一服务器上或服务器允许跨域使用。否则,这将引发安全错误。

    var image1 = new Image();
    var image2 = new Image();
    var count = 2;             // two images to load, for more use an array instead
    
    image1.onload = image2.onload = function() {
      count--;
      if (!count) {
        var canvas = document.createElement('canvas');
        canvas.width = 220;
        canvas.height = image1.height;
        var context = canvas.getContext("2d");
    
        context.drawImage(image1, 0, 0);
        context.drawImage(image2, 80, 0);
    
        // the data-uri, use f.ex. a callback function with this as
        // argument to process it further (not shown here)
        var base64 = canvas.toDataURL('image/png');
    
        var img = document.createElement('img'); // ideally, use a handler here too
        img.src = base64;
        document.body.appendChild(img);
      }
    };
    
    // we need cross-origin in this case/demo as images exists on a different server
    // imgur.com allow using cross-origin, not all servers do though...
    image1.crossOrigin = image2.crossOrigin = "anonymous";
    
    // set sources after handlers are defined
    image2.src = "http://i.imgur.com/bk0rvnj.png";
    image1.src = "http://i.imgur.com/wlPnCM1.png";

    【讨论】:

    • 我忘了补充一点,您还应该添加一个错误处理程序,以便在发生意外情况时向用户(或日志)提供反馈。
    • 对不起stackoverflow。我必须感谢本教程的答案。你节省了我大概 2 天的时间。肯,非常感谢!
    • @user3765109 很高兴我能帮上忙!如果您认为答案值得,请考虑投票:)
    • 哦,是的,当然......我很兴奋,但我忘记了:)
    【解决方案2】:

    使用 appendChild() cf.http://jsfiddle.net/27hdp4y6/1/ 只需添加:

    ...
    document.body.appendChild(canvas);
    var context = canvas.getContext("2d");
    ...
    

    【讨论】:

    【解决方案3】:
    1. 首先,JS 是异步的!所以你的图片也会异步加载。
    2. 你应该将画布附加到 DOM:

      document.body.appendChild(canvas);

    工作示例:http://jsfiddle.net/27hdp4y6/2/

    【讨论】:

    • 我已经尝试获取 base64 字符串,并且可以在控制台上看到。但是字符串不起作用。 jsfiddle.net/27hdp4y6/4
    • 这是最新版本:jsfiddle.net/27hdp4y6/5 而且,问题是 CORS 权限被拒绝;(您必须从同一域加载图像。
    • 是的,Sergolius,你是对的。但我没有任何CORS错误。而且我尝试了两种不同的加载方法来解决两个图像。但我无法解决。肯的​​回答似乎不错。我会试试的。
    • 我也尝试了 Ken 的回答,并发现了 CORS 的错误。 (在添加“crossOrigin”属性之后)
    • @sergolius 如果在您的实际环境中加载来自同一域的图像,您必须添加 crossOrigin(除非您的服务器支持此类请求)。另请注意,并非所有服务器都支持 cors 请求 - 如果它们不支持,您仍然会收到 cors 错误(这可能是这种情况下的问题)。我们所能做的就是请求允许在 cors 外部使用图像,服务器可以拒绝..(这就是为什么我将图像移动到 imgur 以使演示工作)
    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    相关资源
    最近更新 更多