使用robotjs捕获并保存图像

时间:2017-01-30 16:47:40

标签: node.js

我尝试使用robotjs(http://robotjs.io/)从屏幕捕获并保存图像,但是当我打开文件位图时,图像的格式不正确。这是我的代码:

var robot = require("robotjs");
var fs = require("fs");
var size = 10;
var img = robot.screen.capture(0, 0, size, size);
fs.writeFileSync('img.bmp',img.image);

2 个答案:

答案 0 :(得分:2)

请注意,来自Robotjsimg.image缓冲区是带有像素的原始缓冲区;不是BMP或PNG或任何其他格式。

您应该进行一些数据转换,并且可能使用支持写入文件的库来保存它(我在Robotjs中没有看到)。

请查看此other question,它还使用robot.screen.capture并使用Jimp库将文件保存到PNG文件。该代码也回答了你的问题。

答案 1 :(得分:1)

Jimp支持将https://v1.vuejs.org/guide/events.html即时转换为PNG,并且工作速度更快。

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

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

将以错误的颜色保存图像。要修复它,您可以使用以下代码:

function screenCaptureToFile2(robotScreenPic, path) {
    return new Promise((resolve, reject) => {
        try {
            const image = new Jimp(robotScreenPic.width, robotScreenPic.height);
            let pos = 0;
            image.scan(0, 0, image.bitmap.width, image.bitmap.height, (x, y, idx) => {
                image.bitmap.data[idx + 2] = robotScreenPic.image.readUInt8(pos++);
                image.bitmap.data[idx + 1] = robotScreenPic.image.readUInt8(pos++);
                image.bitmap.data[idx + 0] = robotScreenPic.image.readUInt8(pos++);
                image.bitmap.data[idx + 3] = robotScreenPic.image.readUInt8(pos++);
            });
            image.write(path, resolve);
        } catch (e) {
            console.error(e);
            reject(e);
        }
    });
}

var pic = robot.screen.capture();
screenCaptureToFile2(pic)