基于Hashcode方法导致错误的图像分析程序

时间:2013-07-30 18:00:21

标签: image-formats image-comparison

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

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

    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天了,我真的很茫然。

您诚挚的, 塞缪尔

0 个答案:

没有答案