栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

画布toDataURL()返回空白图像

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

画布toDataURL()返回空白图像

最有可能在您绘制画布到调用之间有一些异步事件

toDataURL
。默认情况下,每个合成后都会清除画布。通过使用来创建WebGL上下文,
preserveDrawingBuffer:true
以防止清除画布。

var gl = canvas.getContext("webgl", {preserveDrawingBuffer: true});

或确保在退出用于渲染的任何事件之前调用toDataURL。例如,如果您这样做

function render() {  drawScene();   requestAnimationframe(render);}render();

而在其他地方

someElement.addEventListener('click', function() {  var data = someCanvas.toDataURL();}, false);

animationframe
,和这两个事件
click
不同步,在调用它们之间可以清除画布。注意:画布不会被清除,因为它是双重缓冲的,但是toDataURL的缓冲和影响该缓冲正在查看的其他命令已清除。

解决方案是使用

preserveDrawingBuffer
toDataURL
在与渲染相同的事件中调用您的方法。例如

var captureframe = false;function render() {  drawScene();  if (captureframe) {    captureframe = false;    var data = someCanvas.toDataURL();    ...  }  requestAnimationframe(render);}render();someElement.addEventListener('click', function() {  captureframe = true;}, false);

什么

preserveDrawingBuffer:false
是默认值?它可以显着提高速度,尤其是在移动设备上,不必保留绘图缓冲区。另一种查看方式是浏览器需要2个画布副本。您要绘制的图形和正在显示的图形。它有2种方法来处理这2个缓冲区。(一)双缓冲。让您绘制一个,显示另一个,完成渲染后交换缓冲区,这是从退出发出绘制命令的任何事件推断出来的(B)复制您要绘制的缓冲区的内容以执行正在显示的缓冲区。交换比复制快得多。因此,交换是默认设置。实际发生的情况取决于浏览器。唯一的要求是,如果
preserveDrawingBuffer
false
如果复合,则绘图缓冲区将被清除(这是另一个异步事件,因此是不可预测的),如果
preserveDrawingBuffer
是,
true
则必须复制它,以便保留绘图缓冲区的内容。

注意,一旦画布具有上下文,它将始终具有相同的上下文。因此,换句话说,假设您更改了初始化WebGL上下文的代码,但仍要设置

preserveDrawingBuffer:true

至少有两种方法。

首先找到画布,在其上获取上下文

因为后面的代码最终将具有相同的上下文。

<script>document.querySelector('#somecanvasid').getContext(    'webgl', {preserveDrawingBuffer: true});</script><script src="script/that/will/use/somecanvasid.js"></script>

因为您已经为该画布创建了上下文,所以之后的任何脚本都将获得相同的上下文。

增加
getContext

<script>HTMLCanvasElement.prototype.getContext = function(origFn) {  return function(type, attributes) {    if (type === 'webgl') {      attributes = Object.assign({}, attributes, {        preserveDrawingBuffer: true,      });    }    return origFn.call(this, type, attributes);  };}(HTMLCanvasElement.prototype.getContext);</script><script src="script/that/will/use/webgl.js"></script>

在这种情况下,在扩充之后创建的任何webgl上下文

getContext
都将
preserveDrawingBuffer
设置为true。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/575220.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号