如何将二进制缓冲区保存到nodejs中的png文件?

新手上路,请多包涵

我有包含位图信息的二进制 nodejs Buffer 对象。如何从缓冲区制作图像并将其保存到文件?

编辑:

我尝试像@herchu 所说的那样使用文件系统包,但如果我这样做:

 let robot = require("robotjs")
let fs = require('fs')

let size = 200
let img = robot.screen.capture(0, 0, size, size)

let path = 'myfile.png'
let buffer = img.image

fs.open(path, 'w', function (err, fd) {
  if (err) {
    // Something wrong creating the file
  }

  fs.write(fd, buffer, 0, buffer.length, null, function (err) {
    // Something wrong writing contents!
  })
})

我得到

在此处输入图像描述

原文由 Michal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 964
2 个回答

注意:我正在根据您上次的编辑来编辑我的答案

如果您使用的是 Robotjs,请检查其 Bitmap 对象 是否包含 原始 像素数据的缓冲区——不是 PNG 或任何其他文件格式内容,只是彼此相邻的像素(在您的情况下正好是 200 x 200 元素)。

我没有在 Robotjs 库中找到任何以其他格式编写内容的函数(我也不知道),所以在这个答案中我使用不同的库 Jimp 来进行图像处理。

 let robot = require("robotjs")
let fs = require('fs')
let Jimp = require('jimp')

let size = 200
let rimg = robot.screen.capture(0, 0, size, size)
let path = 'myfile.png'

// Create a new blank image, same size as Robotjs' one
let jimg = new Jimp(size, size);
for (var x=0; x<size; x++) {
        for (var y=0; y<size; y++) {
                // hex is a string, rrggbb format
                var hex = rimg.colorAt(x, y);
                // Jimp expects an Int, with RGBA data,
                // so add FF as 'full opaque' to RGB color
                var num = parseInt(hex+"ff", 16)
                // Set pixel manually
                jimg.setPixelColor(num, x, y);
        }
    }
jimg.write(path)

请注意,转换是通过手动遍历所有像素来完成的;这在 JS 中很慢。还有一些关于每个库如何处理其像素格式的细节,因此在循环中需要进行一些操作——从嵌入的注释中应该清楚。

原文由 herchu 发布,翻译遵循 CC BY-SA 3.0 许可协议

虽然@herchu 和@Jake 的解决方案有效,但它们非常慢(根据我的经验,需要 10-15 秒)。


Jimp 支持开箱即用地将 Raw Pixel Buffer 转换为 PNG ,并且工作速度更快(亚秒级)。

 const img = robot.screen.capture(0, 0, width, height).image;
new Jimp({data: img, width, height}, (err, image) => {
    image.write(fileName);
});

原文由 Aziz Yokubjonov 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题