-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 個以下のピクセルが色に一致する場合に成功します。

(または、break ステートメントが両方の for ループから飛び出さないため、色が一致する画像の列は199列までです。)

2 番目のセクションでは、次のようになります。

  1. img1 は、ウィンドウのスクリーンショットのトリミングされたバージョンを少し大きくしたものです。
  2. img2 は .txt306 というランダムなビットマップです

同じポイントで色が比較され (画像サイズが同じであると仮定)、それらが同じである場合はカウンターがインクリメントされます。

あなたによると、img1 の列の 399 未満に img2 に一致するピクセルの色が含まれているため、これは失敗します。

どのような動作を期待していますか? (同じ色のピクセルが位置的に等しいと予想される列はいくつありますか?)

私の仮定では、2 番目の部分は常に count2 < 400 になります。これは、一致するピクセルが少なくとも 1 つある画像の列数を数えることによって作成されたためです。しかし、これらの画像の 1 つをトリミングして作成し、トリミングは次のように行いました。

new Rectangle(150, 55, 350, 300)

新しい img2 には 400 を超える列がないように見えます。

おそらく、「break」の代わりに「continue」キーワードを使用するつもりでした

于 2012-07-28T01:59:40.613 に答える