我希望在Visual Studio(C#)中创建一个程序,它可以在屏幕上扫描确切位置的精确图像。我已经看过许多讨论涉及算法以找到“近距离”图像,但我的将是100%准确的;位置,大小等等。
我使用以下代码从我的屏幕[图片1]的一部分获得了一个png:
private void button1_Click(object sender, EventArgs e)
{
//Create a new bitmap.
var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height);
// Create a graphics object from the bitmap.
var gfxScreenshot = Graphics.FromImage(bmpScreenshot);
// Take the screenshot from the upper left corner to the right bottom corner.
gfxScreenshot.CopyFromScreen(1555, 950,
1700, 1010,
Screen.PrimaryScreen.Bounds.Size,
CopyPixelOperation.SourceCopy);
// Save the screenshot to the specified path that the user has chosen.
bmpScreenshot.Save("Screenshot.png");
}
所以,基本上这是我的程序流程图,我想要如何前进: 1)使用上面的代码创建主png 2)运行循环: 使用与主png相同的过程创建相同的屏幕截图 比较主png和新的截图png和if:匹配然后继续,否则重复循环。
我对编程非常陌生,但我不相信这是超出我的,给予一点指导。我写的相当复杂(在我看来)VBA和Matlab程序。任何帮助是极大的赞赏。
谢谢你, 斯隆
答案 0 :(得分:0)
通过微软的文档挖掘一下,我想出了一个粗略的功能,可以做你想做的事情。 https://msdn.microsoft.com/en-us/library/hh191601.aspx
此功能提供了陷入无限循环的机会,因此您可以考虑使用主机超时调用它。有关超时同步方法的信息,请参见此处: Monitoring a synchronous method for timeout
从你的主要部分,你所要做的就是看它是否真实。
static int Main(string[] args)
{
if (ImageInLocation(left, right, top, bottom)) {
// do other things
}
return 0;
}
我唯一不确定的是你对ColorDifference的严格要求。即使图像相同,任何与完全不容忍的ColorDifference的像素差异也会出现错误。如果你知道它应该工作而不是,那么也许可以考虑增加容差。这里有更多信息: https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.uitesting.colordifference.aspx
public bool ImageInLocation(int left, int right, int top, int bottom) {
bool image_found = false;
var masterImage = Image.FromFile("path_to_master");
while (!image_found) {
// screenshot code above, output to "path_to/Screenshot.jpg"
var compImage = Image.FromFile("path_to/Screenshot.jpg");
// note, all zeroes may not be tolerant enough
var color_diff = new ColorDifference(0, 0, 0, 0);
Image diffImage;
image_found = ImageComparer.Compare(masterImage, compImage, color_diff, out diffImage);
}
return true;
}
祝你好运!欢迎来到编程社区。 p>
此外,如果有人有任何建议/更改,请随时编辑此内容。快乐的影像,朋友们!