当前位置: 首页 > 面试题库 >

在Fabric.js中将Canvas下载为PNG,从而导致网络错误

谭勇
2023-03-14
问题内容

我想使用fabric.js将Canvas下载为PNG。下载时,我想缩放图像。所以我使用函数的multiplier属性toDataURL()。但我收到失败网络错误

PS: 如果我不提供multiplier财产,它正在下载,但是我 确实 想使用multiplier财产,因为我必须缩放图像

这就是我在做什么:

HTMLhtml" target="_blank">代码:

<canvas width="400" height="500" id="canvas" ></canvas>
 <a id='downloadPreview' href="javascript:void(0)"> Download Image </a>

JS

document.getElementById("downloadPreview").addEventListener('click', downloadCanvas, false);

var _canvasObject = new fabric.Canvas('canvas');

var downloadCanvas =    function(){
    var link = document.createElement("a");

link.href = _canvasObject.toDataURL({format: 'png', multiplier: 4});
      link.download = "helloWorld.png";
     link.click();

}

问题答案:

您面临的问题与fabric.js(也不是canvas,甚至不是javascriptbtw)都没有直接关系,而是由于某些浏览器(包括Chrome)确实限制了带有下载的src锚元素(<a>)的属性的最大长度属性。

当达到此限制时,您唯一需要的就是控制台中无法捕获的“网络错误”;下载失败,但是作为开发人员的您却不知道。

正如在此 _(您拒绝标记为)_重复项中所建议的,解决方案是直接在可用时直接获取Blob(对于画布,您可以调用其toBlob()方法,或者首先将dataURI转换为Blob,然后然后从该Blob创建一个对象URL。

Fabricjs似乎toBlob尚未实现功能,因此在您的确切情况下,您将需要稍后执行。 您可以找到许多脚本将dataURI转换为Blob,MDN的polyfilltoCanvas.toBlob()方法中提供了一个脚本。

然后看起来像这样:

// edited from https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob#Polyfill
function dataURIToBlob(dataURI, callback) {
  var binStr = atob(dataURI.split(',')[1]),
    len = binStr.length,
    arr = new Uint8Array(len);

  for (var i = 0; i < len; i++) {
    arr[i] = binStr.charCodeAt(i);
  }

  callback(new Blob([arr]));
}

var callback = function(blob) {
    var a = document.createElement('a');
    a.download = fileName;
    a.innerHTML = 'download';
    // the string representation of the object URL will be small enough to workaround the browser's limitations
    a.href = URL.createObjectURL(blob);
    // you must revoke the object URL, 
    //   but since we can't know when the download occured, we have to attach it on the click handler..
    a.onclick = function() {
      // ..and to wait a frame
      requestAnimationFrame(function() {
          URL.revokeObjectURL(a.href);
        });
        a.removeAttribute('href')
      };
    };

dataURIToBlob(yourDataURL, callback);


 类似资料:
  • 我想使用fabric将画布下载为PNG。js。下载时,我想缩放图像。所以我使用了函数的属性。但我收到失败的网络错误 PS:如果我没有提供乘法器属性,它正在下载,但我确实想使用乘法器属性,因为我必须缩放图像 这就是我正在做的: 超文本标记语言代码: JS

  • 问题内容: 我有以下网址: 我尝试下载文件: 这产生了一个名为“ test.xls”的文件,但这显然是一个html文件。如果我在firefox中打开了html文件,则打开了一个excel文件,但是如果我在excel中打开了文件,那绝对不是我要找的excel文件。 如果我有一个与上述地址相同的网址,如何使python将excel文件下载为excel文件? 问题答案: 这会将excel文件保存在运行脚

  • 问题内容: 是否可以捕获或打印html画布中显示为图像或pdf的内容? 我想通过画布生成图像,并能够从该图像生成png。 问题答案: 原始答案是针对类似问题的。这已被修改: 使用IMG中的值,您可以将其写为新图像,如下所示:

  • google cloud SDK无法下载,导致此错误。 “find”不能识别为内部或外部命令、可操作程序或批处理文件。

  • 从用户处获取文件(使用“dropzone”拖放引导模块接收文件) 修改并对文件进行一些“工作” 将文件压缩到一起,以便下载单个文件 将下载内容发送回用户进行下载(自动或通过链接,详情如下) 上面的粗线是不起作用的,我正在努力弄清楚。以下是相关的超文本标记语言和javascript的文章: 用户单击"转换上传文件"按钮,然后将href更新到生成的zipfile位置,然后能够通过单击"下载文件"超文本