【问题标题】:"CanvasRenderingContext2D" error at converting jpeg to data-url [closed]将 jpeg 转换为 data-url 时出现“CanvasRenderingContext2D”错误 [关闭]
【发布时间】:2015-02-14 11:37:52
【问题描述】:

我在我的 chrome 应用程序上工作,内容安全政策令人不安。我想从 json (我不知道的字符串/对象/数组) 中获取 jpeg 图像,但是 csp 每次都阻止了我。现在我知道使用数据链接更容易,所以I searched a converter

function getdt(img) {
    // Create an empty canvas element
    var canvas = document.createElement("canvas");

    // Copy the image contents to the canvas
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0, img.width, img.height);

    // Get the data-URL formatted image.
    var dataURL = canvas.toDataURL("image/png");

    return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}

//Example
getdt('http://ms01.oe3.fm/oe3metafiles/Pictures/200/929203.22.jpg');

不幸的是,这不起作用。错误信息是这样的:

Uncaught TypeError: 
Failed to execute 'drawImage' on 'CanvasRenderingContext2D': 
No function was found that matched the signature provided.

我希望有人可以帮助我:) 对不起,我的英语不好

【问题讨论】:

  • 什么是img?提供相关代码

标签: jquery canvas jpeg drawimage data-url


【解决方案1】:

您的代码有 3 个问题:

  1. 正如@A.Wolff 推断的那样,您的 img 无效。 Canvas 需要一个完整的 Image 对象来绘制,而不仅仅是一个 URL。所以你必须“新建”一个图像对象var img=new Image();

  2. 图像是异步加载的,因此您必须使用将drawImagetoDataURL 放入img.onload 回调中。这允许在您尝试使用图像之前完全加载图像。这也意味着您还必须将所有使用 dataURL 的代码放入 onload 回调中,而不是 return dataURL。 (是的,我知道,这很乱,但你必须这样做,否则图像没有完全加载)

  3. 出于良好的安全原因,要使用toDataURL,您的图片必须与您的网页托管在同一个域中。如果它们是不同的域,toDataURL 将失败并出现安全错误。此安全问题是一个涉及的主题,因此您可以在此处了解避免安全错误的必要条件:http://enable-cors.org/

...而且:toDataURL 的 jpg 编码使用image/jpeg 所以你需要改变你的正则表达式。

这是您的代码重构并使用以不产生安全错误的方式托管的图像:

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;


var img=new Image();
img.crossOrigin='anonymous';
img.onload=start;
img.src="https://dl.dropboxusercontent.com/u/139992952/multple/sun.png";
function start(){

  canvas.width=img.width;
  canvas.height=img.height;
  ctx.drawImage(img,0,0);
  var dataURL=canvas.toDataURL(); // png is the default format

  dataURL=dataURL.replace(/^data:image\/(png|jpeg);base64,/, "");

  // Your dataURL is now available
  // Use it as desired
  alert('The dataURL is '+dataURL.length+' characters long ans starts with: '+dataURL.substring(0,20));

}
body{ background-color: ivory; padding:10px; }
#canvas{border:1px solid red;}
<canvas id="canvas" width=300 height=300></canvas>

【讨论】:

    猜你喜欢
    • 2013-06-04
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多