readPixels到base64(WebGL服务器端缓冲区转换)

cri*_*e09 5 html glreadpixels webgl server-rendering

我正在使用headless-gl在Node.js上运行webGL,在服务器上动态创建一个图像.一旦创建,在用户通过API再次访问图像之前,图像将存储在数据库(MongoDB)中.

下面是生成图像的部分:

var pixels = new Uint8Array(width * height * 4)
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
Run Code Online (Sandbox Code Playgroud)

然后将像素转换为base64(因为这似乎是客户端HTML中Image加载的推荐方式).

var base64Image = new Buffer(pixels, 'binary').toString('base64');
Run Code Online (Sandbox Code Playgroud)

但是,此缓冲区生成的字符串无法解码以生成图像.可能是像素不是'二进制'类型?或者我应该将像素字符串保存在数据库中并尝试在客户端中逐个像素地重绘画布中的像素(我不认为这是最好的方法)?

Ent*_*ack 2

您从中获得的gl.readPixels是位图数据。我使用Jimp库将数据转换为不同的格式,然后从中获取 Base64 图像字符串。

NodeJS 代码

var Jimp = require("jimp")

//Create context
var width = 50
var height = 50

var gl = require('gl')(width, height, { preserveDrawingBuffer: true })

//Clear screen to red
gl.clearColor(1, 0, 0, 1)
gl.clear(gl.COLOR_BUFFER_BIT)

// get bitmap data 
var bitmapData = new Uint8Array(width * height * 4)
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, bitmapData)

// use Jimp library to create an image with a specific mime type
var image = new Jimp(width, height, function (err, image) {

    // assign the bitmap as data for the image 
    image.bitmap.data = bitmapData
    // generate base64
    image.getBase64("image/png", function (error, str) {
        // result
        console.log(str)
    })
})
Run Code Online (Sandbox Code Playgroud)

在浏览器中测试它是否适合您(JS代码):

var base64Img = "" // TODO paste the result from NodeJS

document.body.innerHTML = ""
document.write('<img src="' + base64Img + '"/>');
Run Code Online (Sandbox Code Playgroud)