【发布时间】:2017-08-03 18:22:33
【问题描述】:
我正在使用画布将图像转换为 base64。我需要做的是转换这些图像,然后将结果显示给用户(原始图像和 base64 版本)。小图像一切正常,但是当我尝试转换大图像(> 3MB)并且转换时间增加时,base64版本为空。
这可能是 is 导致的,因为结果在 toDataURL() 函数完成之前显示。
为了测试目的,我需要在所有需要的处理结束后显示结果。
这是我的代码:
var convertToBase64 = function(url, callback)
{
var image = new Image();
image.onload = function ()
{
//create canvas and draw image...
var imageData = canvas.toDataURL('image/png');
callback(imageData);
};
image.src = url;
};
convertToBase64('img/circle.png', function(imageData)
{
window.open(imageData);
});
即使我使用带有回调的 image.onload(),在处理 toDataURL() 后我也无法显示结果。
我做错了什么?
更新:我尝试了以下两种解决方案,但均无效。我在这个项目中使用 AngularJS 和 Electron。 我可以通过什么方式强制代码同步? 或者使用 Promises 的一些解决方案?
更新 #2:@Kaiido 指出 toDataURL() 实际上是同步的,这个问题更可能是由于最大 URI 长度。由于我使用的是 Electron 并且图像预览仅用于测试目的,我将把文件保存在一个文件夹中并从那里进行分析。
【问题讨论】:
-
“这是因为在 toDataURL() 函数完成之前结果显示出来的。” 不,
toDataURL方法是同步的。这更有可能是由于位置的最大 URI 长度,您使用的是什么浏览器?为什么需要 base64 版本?如果只是在新页面中打开图像,则首选blobURI(IE 为msSaveorOpenBlob)和canvas.toBlob方法。 -
感谢您的回复。因为这个应用程序是在 Electron 中运行的,所以我真的必须使用 Chrome。我想要 dataURL 因为我认为这将是查看结果图像的最快方式(用于测试目的)。无论如何,我改变了我的方法,而不是在新窗口中显示图像,而是将其保存到文件中。
-
No toDataURL 比 toBlob 慢,并且是同步的(可能会冻结您的屏幕)。应该始终首选 toBlob。 chrome 确实支持 toBlob 和 blobURI(使用
URL.createObjectURL(blob)创建) -
我最初采用这种方法是因为我使用的是小图像并且一切都可以无缝运行。感谢您的提示:)
标签: javascript canvas callback base64 todataurl