Node.js 如何将十六进制字符串转换为base64以在NodeJS中保存图像

Node.js 如何将十六进制字符串转换为base64以在NodeJS中保存图像,node.js,image,file,base64,hex,Node.js,Image,File,Base64,Hex,我正在制作一个NodeJS sockets.io多人绘图画布。数据保存为2D矩阵中的颜色id,我有一个与id匹配的颜色十六进制代码数组 我需要能够将图像保存为文件,因此我将图像数据存储为连续字符串,加入每个像素的十六进制代码: // 'boardData' contains the index of the color for each pixel // 'colors' is an array on hex values var hexString = "" for (var x = 0;

我正在制作一个NodeJS sockets.io多人绘图画布。数据保存为2D矩阵中的颜色id,我有一个与id匹配的颜色十六进制代码数组

我需要能够将图像保存为文件,因此我将图像数据存储为连续字符串,加入每个像素的十六进制代码:

// 'boardData' contains the index of the color for each pixel
// 'colors' is an array on hex values

var hexString = ""

for (var x = 0; x < boardWidth; x++) {
    for (var y = 0; y < boardHeight; y++) {
        hexString += colors[boardData[x][y]].replace('#','');
    }
}
然后,我尝试通过这样做来保存它:

fs.writeFile("image.png", base64Data, {encoding: 'base64'}, function(err) {
    if (err) return err;
    console.log('Saved!');
});
但最终生成的图像似乎具有不兼容的格式

当我尝试保存一个16x16全白色图像时,base64代码显示为
////////////code>,但当我尝试在线图像转换器时,一个16x16白色图像会变成
ivborw0kggoaaansuhuugaaag…
,将其硬编码到fs.writeFile数据中效果很好。实际上,似乎即使是1x1白色图像也会产生很多字符,所以我不完全确定这是如何工作的


我想我错过了一步。有人能给我指出正确的方向吗?是否有其他方法将原始颜色数据转换为图像文件?

我找到了一个解决方案。这个名为Jimp的库正是我想要的

给任何想知道的人。只需打开一个命令终端,导航到我的nodejs服务器文件夹并运行以下命令即可安装模块:

npm install --save jimp
然后,在我的服务器代码上,我必须导入这个库(注意它必须是大写的J):

所以我只是这样做来保存图像:

let jimg = new Jimp(boardWidth, boardHeight);
for (var x=0; x<boardWidth; x++) {
    for (var y=0; y<boardHeight; y++) {
        var hex = colors[boardData[x][y]].replace('#','');
        var num = parseInt(hex+"ff", 16);
        jimg.setPixelColor(num, x, y);
    }
}
jimg.write("output.png")
let jimg=新Jimp(板宽、板高);

对于(var x=0;席VaR VaR 64)=缓冲区。从(HxSouth','HEX)。toStand(‘Base64’’)不返回正确的Base64数据。。当我为一个全白色的图像控制台.log base64数据时,它会显示////////////…如果我添加一个位置黑色像素,它会显示///////////////AAAA////////…这是将十六进制转换为base64得到的结果,但我非常确定,要使其成为图像格式,它必须包含更多信息。如果我将十六进制转换为“ffffff”在base64中,它变为“///”。这是我将1x1白色像素转换为base64的结果。但当我将1x1白色像素图像输入在线编码器时,它返回相当长的字符串。在我看来,这不是转换为可用格式的正确过程。
var Jimp = require('jimp')
let jimg = new Jimp(boardWidth, boardHeight);
for (var x=0; x<boardWidth; x++) {
    for (var y=0; y<boardHeight; y++) {
        var hex = colors[boardData[x][y]].replace('#','');
        var num = parseInt(hex+"ff", 16);
        jimg.setPixelColor(num, x, y);
    }
}
jimg.write("output.png")