javascript - 我如何获得未更改的屏幕截图并将其保存到 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
. 我尝试的一件事是从 robotsjs 屏幕截图创建一个 Jimp 实例,然后从 Jimp 实例创建一个 Jimp 实例,这样希望颜色会反转回来,但它看起来是一样的。我猜这个问题与robotjs图像数据有关,但我不能确定。
如何获得未更改的屏幕截图并将其保存到文件中?
编辑:
这是一个例子:
正常(非反转)颜色:
反转颜色:
解决方案
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.image
into data
,然后使用 aforEach
循环遍历每个元素并在途中进行必要的更改。 这非常慢,大约需要 800 毫秒才能执行。如果您知道任何更快的方法,请发表评论,或者更好地编辑答案。
推荐阅读
- java - React Native:是否可以在应用重新加载时保留本机 Java 变量值?
- cassandra - Cassandra:你如何在结果中包含查询?
- php - SilverStripe 4 - 大型资产下载耗尽了 HTTPStreamResponse.php 中的 memory_limit
- xamarin - 如何正确实现 xamarin 表单的位置更改侦听器?
- python - 如何计算神经网络输入的输出梯度?
- arduino - avr 中的软件序列号
- javascript - 如果所有值都等于 0,则删除数组中的系列
- flutter - 如何从一个屏幕转到另一个屏幕从堆栈中清除所有先前的屏幕?
- swift - 防止在 CoreData 中保存重复值
- excel - 遇到问题将数据从多个工作表复制/粘贴到外部工作簿。使用 For Each 循环