0

我正在尝试编写一个算法来确定从文件加载的 24 位位图中的位是否存在于内存中已经存在的位数组中。这并不像听起来那么容易:数组memBmp是从 中返回的GetDIBits,所以它是一系列行和填充;因此,查找子位图是否存在不仅仅涉及比较memBmp.

例子:

内存Bmp:

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

搜索第一行,然后在找到后比较后续行

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 回答
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”使用字符串匹配函数会让你的生活更轻松......

于 2013-03-06T23:26:30.237 回答