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