我正在尝试编写一个算法,以确定从文件加载的24位位图中的位是否存在于内存中已有的位数组中。这并不像听起来那么简单:数组memBmp是从GetDIBits返回的,所以它是一系列行和填充;因此,确定子位图是否存在并不只是比较memBmp中连续的子数组。
示例:
memBmp:
0 0 0 1 0 1 0 0
0 0 0 1 0 1 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;
}发布于 2013-03-07 07:26:30
将数组倒置,并添加第四列零。对子位图执行相同的操作。现在认识到一行中的四个位代表十六进制数字,为两个都构造十六进制字符串(一个为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-您可以将一行中的三位视为一个八进制数(0-7)。但是使用字符串匹配函数作为最后的“是否X属于Y”会让你的生活更轻松……
https://stackoverflow.com/questions/15260148
复制相似问题