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