Yus*_*kan 3 javascript html5 canvas html5-canvas fabricjs
我正在使用fabric.js作为我的canvas应用程序,toDataURL方法正常工作,除非画布上有图像.当我将图像添加到画布并调用toDataURL时,它会显示一个空白页面.
//When i call it from chrome console
canvas.toDataURL();
//It returns a working data url with no problem.
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAAGkCAYAAAAPPajHAAAgAElEQ…fpmwgogX1TrjoqP0FACewngtZh+iYCSmDflKuOyk8Q+H+CKCqUW0spTgAAAABJRU5ErkJggg=="
//When i execute same code in a .js file it returns a data url which shows a blank image.
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAAGkCAYAAAAPPajHAAAKC0lEQ…sBAmEBAw6XJzoBA/YDBMICBhwuT3QCBuwHCIQFDDhcnugEHt/IAaW9dzALAAAAAElFTkSuQmCC"
Run Code Online (Sandbox Code Playgroud)
有趣的是,它正在使用chrome dev控制台,但在.js文件中不起作用,即使它是相同的代码.我注意到工作数据网址以'=='结束,但其他网址没有.但是我不知道这意味着什么.
小智 5
你没有给分析太多,但我会从那里看到我的直觉.
您正在使用的映像可能违反了跨源资源共享(CORS)要求.当发生这种情况时,当您尝试使用canvas.toDataURL()
或获取像素数据时,画布将返回空白图像context.getImageData()
.
它基本上发生在图像与页面不在同一域中或从file://协议加载时.
在设置源之前,您可以尝试将以下内容添加到图像对象:
image.crossOrigin = 'anonymous';
image.src = '...';
Run Code Online (Sandbox Code Playgroud)
来自标签:
<img crossOrigin='anonymous' src='...' alt='' />
Run Code Online (Sandbox Code Playgroud)
这将请求服务器允许使用图像跨源.如果服务器允许你应该没事.
如果不是,您将不得不将图像复制到您自己的服务器,以便从与您的页面相同的域加载,或者创建一个代理页面,从外部加载图像并从代理页面将其提供给您的页面(听起来很复杂但是真的不是).
如果图像在画布上根本没有显示,则可能没有使用所需的加载回调,因为图像加载是异步的.如果是这样,请添加:
image.onload = function() {
/// now you can draw the image to canvas
}
image.crossOrigin = 'anonymous';
image.src = '...';
Run Code Online (Sandbox Code Playgroud)
问题已经解决了.我错过的一点是,我在加载画布之前调用了toDataURL函数,这就是为什么它向我展示了一个空白页面.
canvas.loadFromJSON(json,function(){
var dataURL = canvas.toDataURL();
});
Run Code Online (Sandbox Code Playgroud)
当我将toDataURL()函数作为loadFromJSON函数的回调函数时,这解决了我的问题.
但过了一段时间我有一个关于CORS的不同问题,当我试图从s3桶上传我的图像时,我解决了这个问题作为向上解决方案.
归档时间: |
|
查看次数: |
6650 次 |
最近记录: |