首页 > 解决方案 > 我如何获得未更改的屏幕截图并将其保存到 NodeJS 的文件中?

问题描述

我有一个程序可以获取robotjs屏幕截图并将其保存到文件中,例如1 fps 的实时流。

const Jimp=require("jimp");
const robot=require("robotjs");
const fs=require("fs");
setInterval(function(){
    var img=robot.screen.capture();
    new Jimp({
        "data":img.image,
        "width":img.width,
        "height":img.height
    },function(err,image){
        if(err){
            fs.writeFile(__dirname+"/data/screen.png","",function(){});
        }else{
            image.write(__dirname+"/data/screen.png");
        }
    });
},1000);

在当前时刻,每一秒它:

  1. 截屏
  2. 从中创建一个 Jimp 实例
  3. 将其写入screen.png

我想不出任何明显的原因来解释为什么在我截屏时会导致某些颜色反转。

例如,当我在访问 Stack Overflow 后查看图像时,Stack Overflow 图标看起来是蓝色而不是通常的橙色,然后等待一秒钟(以便它可以截取我看截图的截图),在截图中在屏幕截图中,颜色恢复正常——原来的橙色 SO 标志。截图中的截图又是蓝色的,以此类推。需要注意的重要一点是,并非所有颜色都是反转的 - 徽标是反转的,但白色背景不是。

app.jsnode app.js. 我尝试的一件事是从 robotsjs 屏幕截图创建一个 Jimp 实例,然后从 Jimp 实例创建一个 Jimp 实例,这样希望颜色会反转回来,但它看起来是一样的。我猜这个问题与robotjs图像数据有关,但我不能确定。

如何获得未更改的屏幕截图并将其保存到文件中?

编辑:

这是一个例子:

正常(非反转)颜色:

正常(非反转)颜色

反转颜色:

反转颜色

标签: javascriptnode.jscolorsjimprobotjs

解决方案


robotsjs 的缓冲区格式为 BGRA(蓝色、绿色、红色、Alpha/Opacity)。以前,截屏和保存大约需要 100 到 150 毫秒,现在转换为 RGBA(Jimp 使用)后需要 250 到 300 毫秒。它慢了 150 毫秒,但它可以工作。这是完整的代码:

const Jimp=require("jimp");
const robot=require("robotjs");
const fs=require("fs");
setInterval(function(){
    var img=robot.screen.capture();
    var data=[];
    var bitmap=img.image;
    var i=0,l=bitmap.length;
    for(i=0;i<l;i+=4){
        data.push(bitmap[i+2],bitmap[i+1],bitmap[i],bitmap[i+3]);
    }
    new Jimp({
        "data":new Uint8Array(data),
        "width":img.width,
        "height":img.height
    },function(err,image){
        if(err){
            fs.writeFile(__dirname+"/data/screen.png","",function(){});
        }else{
            image.write(__dirname+"/data/screen.png");
        }
    });
},1000);

旁注:这是优化的代码。之前,我使用了一段代码,它复制了img.imageinto data,然后使用 aforEach循环遍历每个元素并在途中进行必要的更改。 这非常慢,大约需要 800 毫秒才能执行。如果您知道任何更快的方法,请发表评论,或者更好地编辑答案。


推荐阅读