【问题标题】:Unable to load an Image into Canvas and get base64 encoding for that image无法将图像加载到 Canvas 并获取该图像的 base64 编码
【发布时间】:2015-10-01 02:31:26
【问题描述】:

我正在尝试使用 jspdf 插件从 HTML 生成 PDF。我坚持将图像加载到 PDF 中。插件中有一个函数 addImage() 对图像进行base64编码,但是将图像转换为base64不起作用。

我用过以下两种方式

//创建画布,在上下文中绘制图像并获取数据url

imgToDataURL =  function (img, outputFormat){
        var canvas = document.createElement('canvas');
        canvas.width = 20;
        canvas.height = 20;
        var c = canvas.getContext('2d');
        c.height = img.height;
        c.width=img.width;
        c.drawImage(img, 0, 0);
        c.save();
        var dataurl = canvas.toDataURL(outputFormat);
        return dataurl;

    }

var img = new Image();
img.crossOrigin = 'Anonymous';
img.src = "image path"
img.height= 60;
img.width=60;
var dataURL = this.imgToDataURL(img,"image/jpeg");
renderer.pdf.addImage(dataURL, 'png',x+padding,y + this.internal.getLineHeight(),imageWidth,imageHeight);

这是打印错误的 dataURL 我得到一个白色的图像。如果我对 base64 代码进行硬编码,即返回一个硬编码的 dataURL,那么 addImage 可以正常工作。所以问题出在 canvas.toDataURL 给我错误的输出

这是第二种方式

convertImgToBase64URL =  function (url, callback, outputFormat){
    var img = new Image();
    img.crossOrigin = 'Anonymous';
    img.onload = function(){
        var canvas = document.createElement('CANVAS'),
        ctx = canvas.getContext('2d'), dataURL;
        canvas.height = this.height;
        canvas.width = this.width;
        ctx.drawImage(this, 0, 0);
        dataURL = canvas.toDataURL(outputFormat);
        callback(dataURL);
        canvas = null; 
    };
    img.src = url;
}

this.convertImgToBase64URL("Image Path",function(base64){

    renderer.pdf.addImage(base64, 'PNG', 20, 20,48,48);
})

我已经在 javascript 中运行了它,并且 onload 函数甚至没有运行我不确定我的错误是什么。

请告诉我我在这两种方式中犯了什么错误

【问题讨论】:

  • 您必须等待您的图像加载完毕,然后才能将它们绘制到画布上下文中。另外,您确定使用正确的跨域标题提供图像吗?如果您的服务器设置不正确,"anonymous" 请求将被阻止,并且您的图像将永远无法加载。除此之外,您的第一个 sn-p 中几乎没有问题(即 context2d 没有宽度和高度属性,save() 在这里没用)但没有人应该阻止您的代码。
  • 是的,但我不确定如何检查图像是否已加载。对于少数图像,我确实得到了以下异常“来自来源的图像'图像服务器路径'已被跨域资源共享策略阻止加载:请求的资源上不存在'Access-Control-Allow-Origin'标头。来源'null' 因此不允许访问。”那么这到底是什么意思。我是 javascript/HTML 的新手,如果我问任何明显的问题,我很抱歉。
  • 你很幸运,我刚刚为这些完全相同的情况写了这些问题和答案(在这种情况下,你不是唯一一个):stackoverflow.com/questions/32880641/…
  • @Kaiido 我写了一个类似的,但不幸的是 img.onload 从未被执行。而且我不确定如何设置 Access-Control_Allow-Origin" 标头。需要注意的一点是,我将所有内容都写在一个 JS 文件中,并在 HTML 中添加这个文件。加载图像会有什么问题吗?跨度>
  • @Kaiido 我现在可以获取图像,但我使用的是 chrome 的 CORS 扩展并在那里启用了跨域资源共享。如果我在那里禁用,则图像不会加载。你能帮我解决这个问题吗?我正在访问的图像位于服务器的公共文件夹中,我可以从 Web 浏览器访问图像

标签: javascript image canvas base64 jspdf


【解决方案1】:

在第一次您错过了为您的图像分配加载功能。因此,当您尝试创建 dataURL 时,图像可能尚未加载,因此,空白图像。您可以尝试将最后几行更改为:

...
img.width=60;
img.onload = function () {
  var dataURL = this.imgToDataURL(img,"image/jpeg");
  renderer.pdf.addImage(dataURL, 'png',x+padding,y + this.internal.getLineHeight(),imageWidth,imageHeight);
}
img.src = "image path";

至于第二个,convertImgToBase64URL() 似乎有问题,它接受 3 个参数,但您传递的是 2。在您的示例中,outputFormat 参数是 undefined

【讨论】:

  • 你可以调用canvas.toDataURL(undefined)或任何其他无效值,它会回退到默认的'image/png'
  • 我试图将 img.onload 包含在第一个中,但 onload 函数永远不会被执行。我保留了一个警报声明以了解 dataURL,但我从未收到该警报。需要注意的一件事是所有处理都在单个 JS 文件中进行。我正在从其他函数传递图像源链接和高度宽度,并调用 imgToDataURL 函数并获取 dataURL 链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2018-04-10
  • 2016-05-22
  • 1970-01-01
  • 2017-03-20
  • 2015-06-17
相关资源
最近更新 更多