从“外部”源将图像加载到画布并保存

时间:2015-03-20 14:20:43

标签: javascript php .htaccess fabricjs

我尝试做的是从我的服务器加载图像并将其添加到画布然后我想保存它。

将图像添加到画布。完成 当我按下保存时,它会抛出一个错误。

Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

我在这里和谷歌上搜索了一下这个错误,但我无法解决它。

我在阅读时将crossOrigin设置为Anonymous,我需要这样做。

var src = "logo.svg";

fabric.util.loadImage(src, function(img) {
    var object = new fabric.Image(img);
    object.set({ 
        left: 0, 
        top: 0
    });
    object.hasRotatingPoint = true;
    object.scaleX = object.scaleY = 1;
    canvas.add(object);
    canvas.renderAll();    
}, null, {crossOrigin: 'Anonymous'});

然后我读到我必须在.htaccess中添加一些规则。

Access-Control-Allow-Origin header

所以我在我的域名上创建了一个.htaccess,其中包含以下几行:

<IfModule mod_setenvif.c>
    <IfModule mod_headers.c>
        <FilesMatch "\.(cur|gif|ico|jpe?g|png|svgz?|webp)$">
            SetEnvIf Origin ":" IS_CORS
            Header set Access-Control-Allow-Origin "*" env=IS_CORS
        </FilesMatch>
    </IfModule>
</IfModule>

然后我检查了mod_setenvif.cmod_headers.c是否已启用:

<?php if (strpos(shell_exec('/usr/local/apache/bin/apachectl -l'), 'mod_headers.c') !== false) {
    echo 'Yes';
}else{
    echo 'No';
} ?>

两者都得到了&#39;是的&#39;。

任何建议都会很棒。

谢谢

编辑:

我尝试的是将图像从我的服务器添加到画布。

2 个答案:

答案 0 :(得分:0)

在我看来,您没有正确引用图片,因为您需要一个完整的网址来访问图片。举个例子:

var src = "http://www.mywebserver.com/images/logo.svg";

您不应该需要交叉原点或.htaccess修改。您的最终代码应如下所示:

var src = "http://www.mywebserver.com/images/logo.svg"

fabric.util.loadImage(src, function(img) {
  var object = new fabric.Image(img);
  object.set({ 
      left: 0, 
      top: 0
  });
  object.hasRotatingPoint = true;
  object.scaleX = object.scaleY = 1;
  canvas.add(object);
  canvas.renderAll();    
}

答案 1 :(得分:-1)

设置crossOrigin: 'Anonymous'将解决此污染画布问题。

示例:

fabric.util.loadImage('sample.png', function(img) {
 ....
}, null, {crossOrigin: 'Anonymous'});

Refernce: https://github.com/kangax/fabric.js/issues/1386