我正在尝试编写一个程序来识别屏幕上的图像,将其与资源库进行比较,然后根据图像源的结果进行计算。
我做的第一件事是创建捕获屏幕功能,如下所示:
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天了,我真的很茫然。
您诚挚的, 塞缪尔