0

ファイルからロードされた24ビットビットマップのビットが、すでにメモリにあるビットの配列内に存在するかどうかを判断するアルゴリズムを作成しようとしています。これは思ったほど簡単ではありません。配列memBmpはから返されるGetDIBitsため、一連の行とパディングです。したがって、サブビットマップが存在するかどうかを確認するには、内の連続するサブ配列を比較するだけでは不十分ですmemBmp

例:

memBmp:

0 0 0 0 0 1 0 1 0 0

0 0 0 0 0 1 0 1 0 0

0 0 0 0 0 1 0 1 0 0

ファイルからロードされたビットマップが次のもので構成されている場合:

1 0 1

1 0 1

1 0 1

このアルゴリズムは、それがmemBmpの「サブビットマップ」であることを認識する必要があります。

基本的なアウトラインを設定しましたが、このアルゴリズムの一致チェック部分を作成する方法については完全にわかりません。

int FindBitmap(TCHAR *file, BYTE *memBmp, int membmpWidth, int membmpHeight)
{
    HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, file, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

    BITMAP bm;
    HDC hDC1 = CreateCompatibleDC(NULL);
    BITMAPINFO bi;
    BYTE *data;
    if(!hBitmap)
    {
        return -1;
    }
    GetObject(hBitmap, sizeof(bm), &bm);
    SelectObject(hDC1, hBitmap);
    bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bi.bmiHeader.biWidth = bm.bmWidth;
    bi.bmiHeader.biHeight = -bm.bmHeight;
    bi.bmiHeader.biPlanes = 1;
    bi.bmiHeader.biBitCount = 24;
    bi.bmiHeader.biCompression = BI_RGB;        
    bi.bmiHeader.biSizeImage = 0;        

    data = (BYTE*)malloc(4*bm.bmWidth*bm.bmHeight);
    GetDIBits(hDC1, hBitmap, 0, bm.bmHeight, data, &bi, DIB_RGB_COLORS);

    // Now what?

    free(data);
    return 0;

}
4

2 に答える 2

1

配列を横向きにして、ゼロの4番目の列を追加します。サブビットマップでも同じことを行います。ここで、行の4ビットが16進数字を表していることを認識し、両方の16進文字列を作成します(一方は8要素、もう一方は値)。文字列照合関数を使用して、一方が他方に存在するかどうかを確認します。

あなたが与えたビットマップの例:

00010100
00010100
00010100

横を向いて、ゼロを追加します。

0000 = '0'
0000 = '0'
0000 = '0'
1110 = 'E'
0000 = '0'
0000 = 'E'
0000 = '0'
0000 = '0'

サブ配列についても同じようにします。

1110 = 'E'
0000 = '0'
0000 = 'E'

これで、「000E0E00」で「E0E」を検索できます。これは一致します。

実際にゼロを追加する必要はありません。連続する3ビットを8進数(0〜7)として扱うことができます。しかし、最後の「XはYに属しますか」に文字列照合関数を使用すると、作業が楽になります...

于 2013-03-06T23:26:30.237 に答える
1

最初の行を検索し、見つかったら後続の行を比較します

for (i = 0; i < ImgWidth - TrgtWidth; i ++)
{
    for (j = 0; j < ImgHeight - TrgtHeight; j++)
    {
        // find first row of trgt[0] at location img[i][j]
        // if you find it iterate over the other rows to confirm they also match.
        // otherwise continue looking for match only for the first row.
    }
}
于 2013-03-06T23:46:51.003 に答える