javascript - 为什么这个包含 SVG 的 `blob:` URL 会污染 Chrome 中的画布?
问题描述
我正在做以下事情:
- 将 SVG 文档生成为字符串
- 使用和在
blob:
URL中捕获它new Blob
createObjectURL
- 使用它创建一个
fabric.Image
对象fromURL
- 在
fromURL
回调中,调用canvas.add
以将新添加Image
到画布
这是我的代码:
var svg = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height = "200"><foreignObject width="100%" height="100%"><text xmlns = "http://www.w3.org/1999/xhtml" style = "font-size: 40px; color: #FFFFFF">Example</text></foreignObject></svg>';
var svgBlob = new Blob([svg], {type: 'image/svg+xml'});
var svgURL = window.URL.createObjectURL(svgBlob);
fabric.Image.fromURL(svgURL,function(oIMG) {
oIMG.crossOrigin = 'Anonymous';
canvas.add(oIMG);
});
然后我尝试getImageData:
var dataImage = context.getImageData(0,0,canvas.width,canvas.height).data;
在 Chrome 中,这给了我错误:
未捕获的 DOMException:无法在“CanvasRenderingContext2D”上执行“getImageData”:画布已被跨域数据污染。
这很奇怪,因为我从不使用任何跨域 URL,只使用blob:
URL。
在 Firefox 中它可以完美运行。该问题似乎特定于 Chrome。
解决方案
这是 Chrome 中的一个已知错误:画布在绘制包含 <foreignObject> 的 SVG 后被污染。该线程中指出了当前的解决方法:
与此同时,如果从数据 URI 加载了同一张图片,画布似乎没有受到污染。
这提供了一种解决方法。
您可以通过以下方式将您的 blob 转换为data:
URLFileReader
:
var svg = '...';
var svgBlob = new Blob([svg], {type: 'image/svg+xml'});
var reader = new FileReader();
reader.readAsDataURL(svgBlob);
reader.onload = function(e) {
var svgDataURL = e.target.result;
fabric.Image.fromURL(svgDataURL, function(oIMG) {
canvas.add(oIMG);
});
}
推荐阅读
- sql - 如何从具有大行的表中选择数据,其中列如 column1%column2
- javascript - 避免用户多次点击提交按钮?
- autohotkey - ctrl+s 未在 autohotkey 脚本中发送
- ios - Swift 5 尝试接受和解析 Firebase 动态链接和深度链接 - 出现错误,并且从不执行我的代码 - 软件导致连接中止
- postgresql - 在 PostgreSQL 中,散列子计划是什么意思?
- bash - cd 遇到问题并返回目录
- javascript - 如何延迟代码直到窗口调整大小结束
- azure - 在 arm 模板中配置自定义自动修复规则(有没有办法添加具有多种操作类型的多个触发条件?)
- vb.net - 如何在 vb.net 中的同一文件上保持写入信息?
- python - 使用 Beatifulsoup 进行抓取之前等待