微信小程序three.js canvas type=“webgl“导出图片

微信小程序three.js canvas type="webgl"导出图片

type="webgl"的canvas标签内添加一个type="2d"的canvas

 <canvas id="canvasWebGL" class="canvasWebGL" type="webgl" disable-scroll="true">
 	<canvas class="helper-canvas" type="2d" id="helperCanvas"></canvas>
 </canvas>

// 主要方法

saveImage() {
    // console.log('saveImage');
    var that = this
    const query = wx.createSelectorQuery();
    query.select('#helperCanvas').fields({
      node: true,
      size: true
    }).exec((res) => {
      // console.log('res[0].node', res[0].node);
       clipWebgl(res[0].node)
        .then(webglImg => {
          
           this.cameraContext.takePhoto({
            quality: 'high',
            success: (result) => {
              
              wx.navigateTo({
                url: '/pages/save/index?cameraUrl=' + result.tempImagePath + '&canvasUrl=' + webglImg.path + '&pages=face',
              })
              this.setData({
                isloading: false
              })
    
            }
          })
        });
    })
    function clipWebgl(helperCanvas) {
      return new Promise((resolve, reject) => {
      
        const [data, w, h] = model.screenshot();
        const ctx = helperCanvas.getContext('2d')
        const imgData = helperCanvas.createImageData(data, w, h);
        helperCanvas.height = imgData.height;
        helperCanvas.width = imgData.width;
  
        ctx.putImageData(imgData, 0, 0);
  
        wx.canvasToTempFilePath({
          canvas: helperCanvas,
          success(res) {
            resolve({
              path: res.tempFilePath,
              width: imgData.width,
              height: imgData.height
            })
          },
          fail(err) {
            reject(err);
          }
        })
      })
    }
  }

mode.js

function screenshot() {
  const {
    width,
    height
  } = renderer.domElement;
	
  const renderTarget = new THREE.WebGLRenderTarget(width, height);
  const buffer = new Uint8Array(width * height * 4);

  renderTarget.texture.encoding = renderer.outputEncoding;
  renderer.setRenderTarget(renderTarget);
  renderer.render(scene, camera);
  renderer.readRenderTargetPixels(renderTarget, 0, 0, width, height, buffer);
  renderer.setRenderTarget(null);
  renderTarget.dispose();

  flip(buffer, width, height, 4);
  return [buffer, width, height];
}

function flip(pixels, w, h, c) {
  // handle Arrays
  if (Array.isArray(pixels)) {
    var result = flip(new Float64Array(pixels), w, h, c);
    for (var i = 0; i < pixels.length; i++) {
      pixels[i] = result[i];
    }
    return pixels;
  }

  if (!w || !h) throw Error('Bad dimensions');
  if (!c) c = pixels.length / (w * h);

  var h2 = h >> 1;
  var row = w * c;
  var Ctor = pixels.constructor;

  // make a temp buffer to hold one row
  var temp = new Ctor(w * c);
  for (var y = 0; y < h2; ++y) {
    var topOffset = y * row;
    var bottomOffset = (h - y - 1) * row;

    // make copy of a row on the top half
    temp.set(pixels.subarray(topOffset, topOffset + row));

    // copy a row from the bottom half to the top
    pixels.copyWithin(topOffset, bottomOffset, bottomOffset + row);

    // copy the copy of the top half row to the bottom half
    pixels.set(temp, bottomOffset);
  }

  return pixels;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值