【发布时间】:2017-05-15 13:25:41
【问题描述】:
所以我尝试使用电子构建一个应用程序,该程序非常基本,用户应该上传几张图片,他们按下一个按钮,我将它们绘制到 <canvas> 元素中,他们应该能够下载它,我遇到的问题是,当我尝试制作可下载按钮时,会引发安全错误,我做了一些研究,发现它是 HTML5 的一个功能,我认为我无法添加 crossOrigin = '匿名'因为用户要从自己的电脑上加载图片,所以我的问题是......
a)- 有没有办法“欺骗系统”并能够下载画布的内容?,
b)- 如果 (a) 不可行...是否有替代方法可以与画布元素类似地工作?
我已经在使用 FileReader() 来获取用户选择的图片,并且我已经将其绘制到画布中,它看起来很棒,我遇到的问题是我无法下载我为那个安全错误创建了。 .toDataURL 不能被调用,因为那是引发错误的那个。
从输入中读取图片的代码:
function handleBox1(evt) {
var files = evt.target.files; // FileList object
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
reader.onload = (function(theFile) {
return function(e) {
$('#imgBox1').attr("src",e.target.result);
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}
这是一个简单的函数,可以查看是否可以从画布中获取 Url:
descargar = function(){
var w=window.open('about:blank','image from canvas');
w.document.write("<img src='"+ totem.toDataURL("image/png")+ "' alt='from canvas'/>");
}
【问题讨论】:
-
你能发布你的代码和错误吗?是的跨域根本与用户上传无关。由第三方网站或链接引起。
-
“...欺骗系统”:不,满足安全要求:是。如果用户拥有现代浏览器,您可以使用 FileReader 获取本地图像而不会触发安全限制。关键是用户必须明确选择所需的文件,从而明确承担上传跨域图像的责任。
-
@markE 链接的问题没有出现在单个
<canvas>元素上绘制多个图像? -
@markE 是的,
FileReader()是返回预期结果的重要部分。如果没记错,<canvas>元素不会出现在链接问题的html处?在绘制到canvas之前,不一定“容易”地添加和减去图像高度;比最初预期的要困难得多。特别是,使用canvas.toDataURL()其中一张图像具有大量size可能会冻结浏览器,因为data URI被写入a.href;使用canvas.toBlob()polyfill 不会导致浏览器冻结,即使方法实际上调用了.toDataURL() -
“在问题中,Gabriel Tortomano 说他们的应用需要“对宽度最大的图像进行排序,将该图像宽度添加到下一个图像宽度,然后在绘制最后一个图像之前减去最后一个图像宽度” ?" 在尝试解决问题时,如果图像具有不同的宽度,如果不使用具有最大
width的图像来设置canvaswidth,则画布可以使用剪切图像进行渲染。虽然FileReader()用于链接问题,但链接问题不要求将两个图像合并到同一个canvas。试图解决当前的问题;甚至没有尝试使用三张图片
标签: javascript html canvas