代码之家  ›  专栏  ›  技术社区  ›  Valerii

如何将offscreencavas转换为datauri

  •  0
  • Valerii  · 技术社区  · 6 年前

    我需要在非屏幕canvas上绘制一些图形,然后将其显示为DIV元素的背景图像。

    最简单的方法是什么?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Kaiido NickSlash    6 年前

    最简单的方法是使用 OffscreenCanvas.convertToBlob() 也称为 offscreencanvas.toblob()中 在Firefox中。

    根据经验,您不需要dataurl版本。几乎所有你想用dataurl做的事情都应该用bloburl来代替。
    bloburls允许我们链接到必须只在内存中存储一次的数据,而datauri每次以字符串形式出现时将占用所需数据的134%,每次提取时将占用实际数据的100%。

    (function() {
    const worker = new Worker(generateWorkerURL());
    worker.onmessage = e => {
      // generate a blobURI from the Blob
      const url = URL.createObjectURL(e.data.blob);
      // use it
      document.body.style.backgroundImage = `url(${url})`;
    };
    
    const canvas = document.createElement('canvas');
    canvas.width = canvas.height = 100;
    const offscreen = canvas.transferControlToOffscreen();
    
    worker.postMessage({canvas: offscreen}, [offscreen]);
    
    function generateWorkerURL() {
      const scr = document.querySelector('[type="worker-script"]');
      const cont = scr.textContent;
      const blob = new Blob([cont], {type: 'text/javascript'});
      return URL.createObjectURL(blob);
    }
    })();
    body{width: 100vw; height: 100vh; margin: 0}
    <script type="worker-script">
      onmessage = e => {
        const canvas = e.data.canvas;
        // red squares 
        const gl = canvas.getContext('webgl');
        gl.viewport(0, 0,
        gl.drawingBufferWidth, gl.drawingBufferHeight);
        gl.enable(gl.SCISSOR_TEST);
        gl.scissor(20, 20, 60, 60);
    
        gl.clearColor(1.0, 0.0, 0.0, 1.0);
        gl.clear(gl.COLOR_BUFFER_BIT);
        // export as Blob
        (canvas.convertToBlob || canvas.toBlob).call(canvas)
        .then(blob => {
          postMessage({blob});
        });
    
      }
    
    </script>