使用 powershell 如何在缓冲区中比较两个屏幕截图?

使用 powershell 如何在缓冲区中比较两个屏幕截图?

我发现此片段对我来说,每分钟截取一次屏幕截图的效果很好。我可以散列结果并比较两个最新的屏幕截图是否有变化,方法是:这个帖子:(Get-FileHash $fileA).hash -ne (Get-FileHash $fileC).hash在 If 语句内。

我正在考虑引用缓冲区中的屏幕截图,而不是将它们保存在硬盘上,我的意思是我想将屏幕截图保存在缓冲区中,然后在该代码片段保存它们时对它们进行比较。

答案1

使用您所说的代码是不可能的。

$File = "E:\temp\myscreenshot.bmp"
Add-Type -AssemblyName System.Windows.Forms
Add-type -AssemblyName System.Drawing

# Gather Screen resolution information
$Screen = [System.Windows.Forms.SystemInformation]::VirtualScreen

# .. monitor width in pixels..
$Width = [System.Windows.Forms.SystemInformation]::PrimaryMonitorSize.Width

# .. monitor height in pixels..
$Height = [System.Windows.Forms.SystemInformation]::PrimaryMonitorSize.Height

# .. Capture points
$Left = 0 # ..monitor starting left pixel..
$Top = 0 # ..monitor starting top pixel, normally zero..

穷人的调试 - 使用变量压缩来分配和屏幕输出结果在交付之前删除边缘括号

# Create bitmap using the top-left and bottom-right bounds
($bitmap = New-Object System.Drawing.Bitmap $Width, $Height)

# Create Graphics object
($graphic = [System.Drawing.Graphics]::FromImage($bitmap))

# Capture screen
($graphic.CopyFromScreen($Left, $Top, 0, 0, $bitmap.Size))

# Save to file
$bitmap.Save($File)

您会注意到,通过上述输出,没有任何物理/文件系统相关的东西可以为您提供适合您用例的任何内容。

当然,您可以按照原样使用代码,增加图像文件名,进行比较并决定删除哪个。

文件系统 cmdlet(如...获取文件哈希等),表示您正在处理序列化文件。

获取文件哈希

模块:Microsoft.PowerShell.Utility

使用指定的哈希算法计算文件的哈希值。

OP 更新

就我个人而言,我从未尝试过,也从未遇到过需要它的用例。所以,这是一个概念,但有可能,目前就我所了解的一切而言,这都是猜测。特别是在您计划用它做什么之后对其进行哈希处理和序列化。文件系统 cmdlet 的设计只适用于文件系统。

至于将内容放入缓冲区。我建议你阅读 Trevor Sullivan 的博客文章这里,其中他演示了如何在 PowerShell 中初始化字节数组。

有时您需要将新缓冲区初始化为字节数组。例如,如果您想使用 System.Random 类上的 NextBytes() 方法生成随机数据,则需要传入一个字节数组缓冲区以供该方法写入。在 PowerShell 中创建字节数组可能并不那么容易。

相关内容