我如何获得未更改的屏幕截图并将其保存到 NodeJS 的文件中?
How would I get an unaltered screenshot and save it to a file from 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);
当前时刻,每秒它:
- 截屏
- 从中创建一个 Jimp 实例
- 写入
screen.png
我想不出任何明显的原因来解释为什么这会导致我在截屏时反转某些颜色。
例如,当我访问 Stack Overflow 后查看图像时,Stack Overflow 图标看起来是蓝色而不是通常的橙色,等了一秒钟后(这样它就可以截取我正在看的屏幕截图), 在截图中的截图中,颜色恢复正常——原来的橙色 SO 标志。截图中的截图又是蓝色的,依此类推。需要注意的重要一点是,并非所有颜色都是反转的 - 徽标是,但白色背景不是。
我 运行 这个文件 (app.js
) 和 node app.js
。我尝试的一件事是从 robotjs 屏幕截图创建一个 Jimp 实例,然后从 Jimp 实例创建一个 Jimp 实例,这样希望颜色会反转回来,但它看起来是一样的。我猜测问题与robotjs图像数据有关,但我不能确定。
我如何获得未更改的屏幕截图并将其保存到文件中?
编辑:
这是一个例子:
正常(未反转)颜色:
反转颜色:
robotjs 的缓冲区格式为 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.image
复制到 data
中,然后使用 forEach
遍历每个元素并在途中进行必要的更改。 执行速度非常慢,大约需要 800 毫秒。如果您知道任何更快的方法,请发表评论,或者更好地编辑答案。
我有一个程序可以截取 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);
当前时刻,每秒它:
- 截屏
- 从中创建一个 Jimp 实例
- 写入
screen.png
我想不出任何明显的原因来解释为什么这会导致我在截屏时反转某些颜色。
例如,当我访问 Stack Overflow 后查看图像时,Stack Overflow 图标看起来是蓝色而不是通常的橙色,等了一秒钟后(这样它就可以截取我正在看的屏幕截图), 在截图中的截图中,颜色恢复正常——原来的橙色 SO 标志。截图中的截图又是蓝色的,依此类推。需要注意的重要一点是,并非所有颜色都是反转的 - 徽标是,但白色背景不是。
我 运行 这个文件 (app.js
) 和 node app.js
。我尝试的一件事是从 robotjs 屏幕截图创建一个 Jimp 实例,然后从 Jimp 实例创建一个 Jimp 实例,这样希望颜色会反转回来,但它看起来是一样的。我猜测问题与robotjs图像数据有关,但我不能确定。
我如何获得未更改的屏幕截图并将其保存到文件中?
编辑:
这是一个例子:
正常(未反转)颜色:
反转颜色:
robotjs 的缓冲区格式为 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.image
复制到 data
中,然后使用 forEach
遍历每个元素并在途中进行必要的更改。 执行速度非常慢,大约需要 800 毫秒。如果您知道任何更快的方法,请发表评论,或者更好地编辑答案。