检查屏幕上是否有确切位置的确切图像

时间:2016-07-14 20:41:58

标签: image bitmap screen screenshot

我希望在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程序。任何帮助是极大的赞赏。

谢谢你, 斯隆

1 个答案:

答案 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;
}
祝你好运!欢迎来到编程社区。

此外,如果有人有任何建议/更改,请随时编辑此内容。快乐的影像,朋友们!