1

我正在尝试编写一个程序来识别屏幕上的图像,将其与资源库进行比较,然后根据图像源的结果进行计算。

我做的第一件事是创建如下所示的捕获屏幕功能:

    private Bitmap Screenshot()
    {
        System.Drawing.Bitmap Table = new System.Drawing.Bitmap(88, 40, PixelFormat.Format32bppArgb);
        System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(RouletteTable);
        g.CopyFromScreen(1047, 44, 0, 0, Screen.PrimaryScreen.Bounds.Size);
        return Table;
    }

然后,我分析这张图。我使用的第一种方法是创建两个 for 循环并逐个像素地分析这两个位图。这种方法的问题是时间,完成37次需要很长时间。我环顾四周,发现了转换为字节和转换为哈希的方法。这是结果:

public enum CompareResult
        {
            ciCompareOk,
            ciPixelMismatch,
            ciSizeMismatch
        };

    public CompareResult Compare(Bitmap bmp1, Bitmap bmp2)
    {
        CompareResult cr = CompareResult.ciCompareOk;
        //Test to see if we have the same size of image
        if (bmp1.Size != bmp2.Size)
        {
            cr = CompareResult.ciSizeMismatch;
        }
        else
        {
            //Convert each image to a byte array
            System.Drawing.ImageConverter ic = new System.Drawing.ImageConverter();
            byte[] btImage1 = new byte[1];
            btImage1 = (byte[])ic.ConvertTo(bmp1, btImage1.GetType());
            byte[] btImage2 = new byte[1];
            btImage2 = (byte[])ic.ConvertTo(bmp2, btImage2.GetType());

            //Compute a hash for each image
            SHA256Managed shaM = new SHA256Managed();
            byte[] hash1 = shaM.ComputeHash(btImage1);
            byte[] hash2 = shaM.ComputeHash(btImage2);


            for (int i = 0; i < hash1.Length && i < hash2.Length&& cr == CompareResult.ciCompareOk; i++)
            {
                if (hash1[i] != hash2[i])
                    cr = CompareResult.ciPixelMismatch;
            }
        }
        return cr;
    }    

在我分析了这个函数中的两个位图之后,我在我的主窗体中调用它,如下所示:

Bitmap Table = Screenshot();
CompareResult success0 = Compare(Properties.Resources.Result0, Table);           
if (success0 == CompareResult.ciCompareOk)
                { double result = 0; Num.Text = result.ToString(); goto end; }

我遇到的问题是,一旦这一切都完成了,我总是得到一个 ciPixelMismatch 的 cr 值。即使图像相同,我也无法使图像匹配。

为了给您更多关于这两个位图的背景信息,它们大约为 88 x 40 像素,位于屏幕上的 1047、44 处。我编写了一部分程序来自动拍摄该区域的照片,因此我不必担心捕获的位置或大小错误:

Table.Save("table.bmp");

我拍完照片保存后,直接从项目中的bin文件夹移到资源文件夹中,再次运行程序。尽管如此,结果仍然是 ciPixelMismatch。我相信问题在于图片保存的格式。我相信尽管它们是相同的图像,但它们正在以不同的格式进行分析,也许其中一张图片比另一张图片包含更多的信息,这导致了不匹配。有人可以帮我解决这个问题吗?我刚刚开始我的 c# 编程,我已经进入学习过程 5 天,对此我真的很茫然。

您真诚的,塞缪尔

4

0 回答 0