webgl截屏保存图片

330 阅读1分钟

前端webgl怎样截屏并下载图片?

    const canvas = document.createElement('canvas')
    canvas.width = 1920
    canvas.height = 1080

    const webglPlayer = new WebGLPlayer(canvas, {
      preserveDrawingBuffer: true // 这里必须设为true,如果是false,下面方法获取到的都是个空白的canvas画布
    })

方案1: 获取到webglPlayer的canvas,直接利用toDataURL方法获得图片的一个地址,再使用a标签下载。

    const { canvas } = webglPlayer
    const imgUrl = canvas.toDataURL('image/jpg')
    let link = document.createElement('a')
    link.href = imgUrl
    link.download = 'canvas下载' + '.jpg'
    link.click()

方案2: 获取webgl的像素,将像素转为图片下载。

function downloadFromPixels(gl, width, height) {
    // 获取像素,并对像素做翻转处理
    function getPixels(gl, width, height) {
      const length = width * height * 4
      const row = width * 4
      const end = (height - 1) * row
      const arr = new Uint8Array(length)
      const pixels = new Uint8Array(length)
       // 获取像素
      gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, arr)
        // 翻转,不翻转你会发现下载下来的图片是倒着的
      for (let i = 0; i < length; i += row) {
        pixels.set(arr.subarray(i, i + row), end - i)
      }
      return pixels
    }
    // 将像素转为图片url
    function pixel2Image(pixels, width, height) {
      const newCanvas = document.createElement('canvas')
      newCanvas.width = width
      newCanvas.height = height
      const ctx = newCanvas.getContext('2d')
      const imageData = ctx.createImageData(width, height)
      imageData.data.set(new Uint8ClampedArray(pixels))
      ctx.putImageData(imageData, 0, 0)
      return newCanvas.toDataURL('image/jpg')
    }
    const pixels = getPixels(gl, width, height)
    const src = pixel2Image(pixels, width, height)
    let dl = document.createElement('a')
    dl.href = src
    dl.download = 'pixels下载' + '.jpg'
    dl.click()
  }
  const { canvas, gl } = webglPlayer
  downloadFromPixels(gl, canvas.width, canvas.height)

总结:方案1比方案2简单,两种方法下载得到的图片没啥区别(从大小和质量上都一样)。