收藏
回答

canvas webgl 如何导出图片?

小程序webgl的canvas如何导出图片

回答关注问题邀请回答
收藏

4 个回答

  • Cailven
    Cailven
    2020-04-08

    感谢这贴给我的启发,我把我最终解决webgl导出图片的方法分享给大家。

    1、在webgl的canvas外再建一个新的2d canvas(作为存图中转)。css里设置left:-1000移到画面外面。

    2、使用 gl.readPixels获取到webgl canvas的帧缓存的二进制流(Uint8Array)。

    3、使用wx.canvasPutImageData把二进制流推给中转的2d canvas。

    4、使用wx.canvasToTempFilePath导出2d canvas上的截图。

    亲测成功后,稍后我把代码整理成片段分享给大家。(注:开发者工具里readPixels取不到值一直是全黑,真机是好的。


    saveImg: function () {
          // var gl = renderer.getContext();
          var gl = canvas.getContext("webgl", {
            preserveDrawingBuffertrue
          });
    
    
          // gl.clearColor(1, 1, 0, 1);
          // gl.clear(gl.COLOR_BUFFER_BIT);
          // renderer.render(scene, camera);
    
    
          const {
            drawingBufferWidth: width,
            drawingBufferHeight: height
          } = gl;
          const pixels = new Uint8Array(width * height * 4);
    
    
          gl.readPixels(00, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);     
          wx.canvasPutImageData({
            canvasId"draw",
            datanew Uint8ClampedArray(typedArrayToBuffer(pixels)),
            x0,
            y0,
            width: width,
            height: height,
            success(res) {
              console.log(res);
              setTimeout(save, 1000);
              // save();
            },
            fail(res) {
              console.log(res);
            }
          }, self);
    
    
          function save() {
            wx.canvasToTempFilePath({
              x0,
              y0,
              width: width,
              height: height,
              destWidth: width,
              destHeight: height,
              canvasId'draw',
              success(res) {
                console.log(res.tempFilePath);
                wx.saveImageToPhotosAlbum({
                  filePath: res.tempFilePath, //仅为示例,并非真实的资源
                  success(res) {
    
    
                  }
                })
              },
              fail(res) {
                console.log(res);
              }
            }, self)
          }
    
    
          function typedArrayToBuffer(array{
            return array.buffer.slice(array.byteOffset, array.byteLength + array.byteOffset)
          }
    
    
        }
    
    2020-04-08
    有用 2
    回复 7
    • 小伟
      小伟
      2021-11-11回复+龙
      iOS 需要关闭抗锯齿
      2021-11-11
      回复
    • 青石
      青石
      2022-11-21
      我发现获取到的像素不全,而且获取到的内容是上下颠倒的,不知道是什么原因
      2022-11-21
      回复
    • 青石
      青石
      2022-11-21
      https://developers.weixin.qq.com/community/develop/article/doc/0008c83aebc56873929bdbeaa5f413   图片颠倒可以看这个,需要对获取的像素进行翻转
      2022-11-21
      回复
    • khalil
      khalil
      2022-11-25回复青石
      你好,想问下像素不全的问题你解决了嘛?
      2022-11-25
      回复
    • 青石
      青石
      2022-11-27回复khalil
      解决了,是我代码的canvas尺寸问题,没有完全绘制导出的像素信息。不过后面还有一个大问题,微信提供的AR会有穿模问题,因为renderGL函数里面关闭了深度检测。如果使用默认的深度检测,安卓机器上摄像头的数据会有黑块。
      2022-11-27
      回复
    查看更多(2)
  • V·R·Jay
    V·R·Jay
    2021-12-17

    执行重新渲染图像函数,然后立马执行导出函数,我项目用的webgl2模式可以这样导出

    2021-12-17
    有用
    回复
  • 唯美的根号三
    唯美的根号三
    2019-10-14

    木头兄,有解决这个问题吗?

    2019-10-14
    有用
    回复 3
    • 木头
      木头
      2019-10-14
      看另一条评论
      2019-10-14
      回复
    • 唯美的根号三
      唯美的根号三
      2019-10-14回复木头
      我看了,没看懂,你们尽力去解决了,但是没解决的样子
      2019-10-14
      回复
    • Cailven
      Cailven
      2020-04-08
      toDataURL好像又不能用了。坑爹
      2020-04-08
      回复
  • A notorious liar(小花猫)
    A notorious liar(小花猫)
    2019-09-02

    直接获取当前canves内容啊然后执行下载图片就好

    2019-09-02
    有用
    回复 14
    • 木头
      木头
      2019-09-02
      你试过没,webgl的canvas不能通过id获取,会报找不到
      2019-09-02
      回复
    • A notorious liar(小花猫)
      A notorious liar(小花猫)
      2019-09-04回复木头
      !!!是我没看清楚需求
      2019-09-04
      回复
    • 朱林涛
      朱林涛
      2019-09-05回复木头
      你好,我也遇到这个问题,请问你解决了吗?
      2019-09-05
      回复
    • 木头
      木头
      2019-09-05回复朱林涛
      gl.canvas.toDataURL(),gl就是getContext的webgl
      2019-09-05
      回复
    • 朱林涛
      朱林涛
      2019-09-05回复木头
      拿到了,谢谢
      2019-09-05
      回复
    查看更多(9)
登录 后发表内容
问题标签