在位图中查找子位图?

时间:2013-03-06 23:21:58

标签: arrays windows search bitmap

我正在尝试编写一个算法来确定从文件加载的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;

}

2 个答案:

答案 0 :(得分:1)

将数组放在一边并添加第四列零。对子位图执行相同操作。现在认识到一行中的四个比特代表一个十六进制数字,为两者构造十六进制字符串(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” - 这将匹配。

你真的不需要添加零 - 你可以将一行中的三位视为八进制数(0-7)。但是使用字符串匹配函数作为最终的“X属于Y”将使你的生活更轻松......

答案 1 :(得分: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.
    }
}