-3

这是我放在一起的一些代码(我没有写所有这些)

Bitmap thisScreenshot = new Bitmap(Width, Height);
Graphics gfxScreenshot = Graphics.FromImage(thisScreenshot);
IntPtr hdcBitmap = gfxScreenshot.GetHdc();
PrintWindow(WindowToFind, hdcBitmap, 0);
gfxScreenshot.ReleaseHdc(hdcBitmap);
//until this is part its just getting image of window(thisScreenshot)
AForge.Imaging.Filters.ResizeBilinear filter = new AForge.Imaging.Filters.ResizeBilinear(100, 60);
Bitmap forthumbnail = filter.Apply(thisScreenshot);
pictureBox1.Image = forthumbnail;
//created thumbnail


//this is where it gets slightly interesting:
Choppa = new AForge.Imaging.Filters.Crop(new Rectangle(150,55,250,200));
Bitmap croppedACCEPTtext = Choppa.Apply(thisScreenshot);
string img1_ref, img2_ref;
Bitmap img1 = croppedACCEPTtext;
Bitmap img2 = Properties.Resources.txt305;
int count1 = 0, count2 = 0;
bool flag = true;
if (img1.Width == img2.Width && img1.Height == img2.Height)
{
    for (int i = 0; i < img1.Width; i++)
    {
        for (int j = 0; j < img1.Height; j++)
        {
            img1_ref = img1.GetPixel(i, j).ToString();
            img2_ref = img2.GetPixel(i, j).ToString();
            if (img1_ref != img2_ref)
            {
                count2++;
                flag = false;
                break;
            }
            count1++;
        }
    }

    if (count2 < 200)
    {
        //THIS IS WORKS, AND HAPPENS CORRECTLY.
        //THIS IS WORKS, AND HAPPENS CORRECTLY.
    }
    else
    {

    }
}
else
{

}
//Now, remaining part above doesnt work. 
//its always false, unless when I look for count2 <400, then its always true.
AForge.Imaging.Filters.Crop Choppah = new AForge.Imaging.Filters.Crop(new Rectangle(150, 55, 350, 300));
croppedACCEPTtext = Choppah.Apply(thisScreenshot);
img1 = croppedACCEPTtext;
count1 = 0;
count2 = 0;
flag = true;
img2 = Properties.Resources.txt306;
if (img1.Width == img2.Width && img1.Height == img2.Height)
{
    for (int i = 0; i < img1.Width; i++)
    {
        for (int j = 0; j < img1.Height; j++)
        {
            img1_ref = img1.GetPixel(i, j).ToString();
            img2_ref = img2.GetPixel(i, j).ToString();
            if (img1_ref != img2_ref)
            {
                count2++;
                flag = false;
                break;
            }
            count1++;
        }
    }

    if (count2 < 400)
    {
        //fail ?
    }
    else

    {
    }
}
else
{

}

这段代码不是我的,并且由于某种原因它们失败了。我似乎无法理解为什么。

4

1 回答 1

2

你应该描述你所说的失败是什么意思。

如果我正确地遵循它,第一部分会:

  1. img1 窗口截图的裁剪版本
  2. img2 是一个名为 .txt305 的随机位图

然后我们比较相同点之间的颜色,如果它们相同,则增加一个计数器。据你说,当不超过 199 个像素匹配颜色时,它就成功了。

(或者更确切地说,不超过 199的图像具有匹配的颜色,因为 break 语句不会跳出两个 for 循环。)

第二部分使:

  1. img1 是窗口截图的稍大的裁剪版本
  2. img2 是一个名为 .txt306 的随机位图

在相同的点比较颜色(假设图像大小相同),如果它们相同,则计数器增加。

根据您的说法,这失败了,因为 img1 的 399 列中包含与 img2 匹配的像素颜色。

你期望什么行为?(您希望有多少列具有相同颜色的位置等效像素?)

我的假设是第二部分将始终具有 count2 < 400,因为它是通过计算具有至少 1 个匹配像素的图像的列数得出的。但是您通过裁剪制作了其中一张图像,并通过以下方式完成裁剪:

new Rectangle(150, 55, 350, 300)

使它看起来像新的 img2 没有超过 400 列。

也许您打算使用“继续”关键字而不是“中断”

于 2012-07-28T01:59:40.613 回答