通过canvas将画布保存为图像.toDataURL结果为黑色矩形
Saving canvas to image via canvas.toDataURL results in black rectangle
我使用Pixi.js并试图将动画的一帧保存为图像。画布。toDataUrl应该工作,但所有我得到的是一个黑色矩形。查看这里的实际示例
我用来提取图像数据和设置图像的代码是: var canvas = $('canvas')[0];
var context = canvas.getContext('2d');
$('button').click(function() {
var data = renderer.view.toDataURL("image/png", 1);
//tried var data = canvas.toDataURL();
$('img').attr('src', data);
})
我知道这个问题已经在SO上被回答了至少5次,但是…
Kaiido提到的将工作,但真正的问题是,画布,当与WebGL一起使用时,默认有2个缓冲区。正在绘制的缓冲区和正在显示的缓冲区。
当你开始绘制到一个WebGL画布,一旦你退出当前事件,例如你的requestAnimationFrame回调,画布被标记为交换这两个缓冲区。当浏览器重新绘制页面时,它会进行交换。您正在绘制的缓冲区与正在显示的缓冲区交换。你现在正在向另一个缓冲区靠拢。该缓冲区被清除。
被清除而不是被单独留下的原因是,浏览器是否实际交换缓冲区或做其他事情取决于浏览器。例如,如果反锯齿是打开的(这是默认的),那么它实际上不会做交换。它做了一个"解析"。它将你刚刚绘制的高分辨率缓冲区转换为普通分辨率抗混叠副本到显示缓冲区。
所以,为了使它更一致,无论浏览器使用哪种默认方式它总是清除你要绘制的缓冲区。否则你不知道它是1帧旧数据还是2帧旧数据。
设置preserveDrawingBuffer: true
告诉浏览器"总是复制,从不交换"。在这种情况下,它不需要清除绘图缓冲区,因为绘图缓冲区中的内容总是已知的。没有交换。
这一切的意义是什么?关键是,如果你想调用toDataURL
或gl.readPixels
,你需要在同一个事件中调用它们。
例如你的代码可以像这样
var capture = false;
$('button').click(function() {
capture = true;
});
function render() {
renderer.render(...);
if (capture) {
capture = false;
var data = renderer.view.toDataURL("image/png", 1);
$('img').attr('src', data);
}
requestAnimationFrame(render);
}
requestAnimationFrame(render);
在这种情况下,因为你调用toDataURL
在相同的javascript事件,因为你渲染到它,你会得到正确的结果总是不管是否preserveDrawingBuffer
是真或假。
如果你正在编写不经常渲染的应用你也可以这样做
$('button').click(function() {
// render right now
renderer.render(...);
// capture immediately
var data = renderer.view.toDataURL("image/png", 1);
$('img').attr('src', data);
});
默认preserveDrawingBuffer
为false的原因是因为交换比复制快,所以这允许浏览器尽可能快地运行。
[注]
虽然这个答案是被接受的,但请务必阅读下面@gman的答案,它确实包含了一种更好的方法。
你的问题是你正在使用webGL上下文,然后你需要将webGL上下文的preserveDrawingBuffer
属性设置为true
,以便能够调用toDataURL()
方法。
或者,您可以通过使用CanvasRenderer
Class
- html5 canvas toDataURL 返回空白图像
- 将Canvas下载为不带.toDataUrl()的图像
- 使用.toDataUrl()将Chart.js画布图表转换为图像会导致空白图像
- 如何使用toDataURL()将图像作为背景图像与画布内容一起添加到一个图像中
- 如何在JSF中将toDataURL方法返回的画布内容作为图像存储在磁盘上
- 使用 canvas.toDataURL() 解码和保存图像
- 如何使用 canvas.toDataURL() 将画布另存为图像
- 如何使用 drawImage 绘制的图像包含在使用 toDataURL 时
- Canvas toDataURL() 给出空白图像
- HTML5 canvas toDataURL 不适用于画布上的图像
- canvas.toDataURL() 抛出安全异常,尽管图像是本地的
- 为什么canvas.toDataURL()不能为图像生成与Ruby中相同的base64
- HTML5 canvas.toDataURL()图像没有背景色
- 使用javaScript打印toDataURL图像
- canvas.toDataURL结果为纯黑图像
- 画布到图像执行失败'toDataURL'在'HTMLCanvasElement':受污染
- Canvas toDataUrl增加了图像的文件大小
- toDataURL()小屏幕,保存的小图像
- phantomjs使用src图像在canvas.toDataURL上抛出DOM异常18
- “canvas.toDataURL(“图像/ png")“;在firefox中无法正常工作