繁体   English   中英

如何从 Mapbox GL JS 获取可用的画布

[英]How to get usable canvas from Mapbox GL JS

我正在使用Mapbox GL ,并尝试获取它的快照,并将快照与覆盖输出的另一个图像合并。

我在屏幕外有一个HTMLCanvasElement ,我首先将从Map.getCanvas()返回的画布写入它,然后在其上写入第二个(alpha 透明)画布。

问题是,虽然我在 Map 实例中清楚地看到屏幕上的元素,但结果只显示了第二个图像/画布,其余的都是空白的。

所以我只导出地图的画布,我看到这是因为地图画布是空白的,尽管console.log()显示来自它的图像数据是一大块信息。

这是我的导出功能:

  onExport(annotationCanvas: HTMLCanvasElement) {

    const mergeCanvas: HTMLCanvasElement = document.createElement('canvas');
    const mapCanvas: HTMLCanvasElement = this.host.map.getCanvas();
    const mergeCtx: CanvasRenderingContext2D = mergeCanvas.getContext('2d');

    mergeCanvas.height = annotationCanvas.height;
    mergeCanvas.width = annotationCanvas.width;
    mergeCtx.drawImage(mapCanvas, 0, 0);
    mergeCtx.drawImage(annotationCanvas, 0, 0);

    const mergedDataURL = mergeCanvas.toDataURL();
    const mapDataURL = mapCanvas.toDataURL();
    const annotationDataURL = annotationCanvas.toDataURL();

    console.log(mapDataURL); // Lots of data

    download(mapDataURL, 'map-data-only.png'); // Blank image @ 1920x1080
    download(mergedDataURL, 'annotation.png'); // Only shows annotation (the second layer/canvas) data

  }

这是一个错误,还是我错过了什么?

更新:我有点想通了这是关于什么的,并且有可能的选择。

在偶然发现Mapbox 功能请求时,我了解到,如果您在将preserveDrawingBuffer选项设置为false (默认值)的情况下实例化您的Map ,您将无法获得带有可用图像数据的画布。 但是将此选项设置为true会降低性能。 但是在实例化 Map 后您无法更改此设置...

我希望地图尽可能发挥最佳性能!!!!

所以,在这个我偶然发现的答案中,关于一个关于three.js的问题,我了解到如果我在渲染后立即截取屏幕截图,我将获得我需要的画布/数据。

我尝试在捕获画布之前调用this.host.map['_rerender']() ,但它仍然返回空白。

然后在源代码中搜索,我找到了一个名为_requestRenderFrame的函数,看起来它可能是我需要的,因为我可以要求 Map 在下一个渲染周期后立即运行一个函数。 但是当我发现,出于某种原因,该函数在编译代码中省略,而在源代码中存在,显然是因为它只存在于 master 中,而不是发布的一部分。

所以我还没有真正满意的解决方案,所以请让我知道任何见解。

正如您在更新的问题中提到的,解决方案是在 Map 初始化时设置preserveDrawingBuffer: true

为了回答你更新的问题,我认为@jfirebaugh 在https://github.com/mapbox/mapbox-gl-js/issues/6448#issuecomment-378307311的回答总结得很好:

不能即时修改preserveDrawingBuffer 它必须在创建 WebGL 上下文时设置,这会对性能产生负面影响。

有传言说,您可以在渲染后立即获取画布数据 URL,而无需preserveDrawingBuffer ,但我尚未验证这一点,我怀疑规范无法保证这一点。

因此,尽管可以在渲染后立即获取画布数据 URL,但规范并不能保证这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM