我正在使用headless-gl在Node上运行webGL.js,在服务器上动态创建图像。创建后,图像将存储在数据库(MongoDB)中,然后用户通过API再次访问图像。
下面是生成图像的部分:
var pixels = new Uint8Array(width * height * 4)
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
然后将像素转换为 base64(因为这似乎是在客户端 HTML 中由 Image 加载的推荐方式)。
var base64Image = new Buffer(pixels, 'binary').toString('base64');
但是,无法解码此缓冲区生成的字符串以生成图像。可能是像素不是"二进制"类型?还是我应该只将像素字符串保存在数据库中,然后尝试在客户端中逐个像素地在画布中重绘像素(我认为这不是最好的方法)?
你从gl.readPixels
得到的是位图数据。我使用 Jimp 库将数据转换为不同的格式,然后从中获取 base64 图像字符串。
节点JS代码
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)
})
})
在浏览器中测试它是否适合您(JS代码):
var base64Img = "" // TODO paste the result from NodeJS
document.body.innerHTML = ""
document.write('<img src="' + base64Img + '"/>');
使用readPixel得到的是原始位图数据,如果您的目标是通过浏览器显示这些数据,则必须将原始数据重新封装为已知的图像文件格式,例如BMP,TGA,JPEG,PNG等。所以你必须以二进制模式构建一个文件(对于BMP或TGA格式,这很容易)。