Здравствуйте Аноним, Вы писали:
А>вот здесь мне очень интересно как учитывать геометрические параметры. Судя по MSDN, GetDIBits копирует участок с некой строчки битмапа Nx с количеством y строк. Но ведь второй битмап отличается не только по длине, но и по ширине! Получается, максимум чего мы добьёмся — это сузим поиск по вертикали. А как его дальше осуществлять по горизонтали ? :???:
Зачем заранее сужать поиск вообще? Этим можно отрезать часть искомого вхождения :)
Просто получаем
полные массивы на обе картинки и начиная с первого пикселя ищем вхождение.
Пусть
I (от image) — это большая картинка, а
P (от part) — это кусочек, который мы ищем в большой картинке. Также нам известны размеры картинок (
sxI,
syI,
sxP,
syP). Зададимся еще счетчиками
xI,
yI,
xP,
yP.
pI и
pP — указатели на массивы большой и маленькой картинок соотвественно.
Алгоритм примерно такой (псевдокод, почти С++ :) ):
bool FindEntry(pI, sxI, syI, pP, sxP, syP, POINT* pt)
{
for(yI = 0; yI < (syI - syP); yI++)
{
for(xI = 0; xI < (sxI - sxI); xI++)
{
if(isEntry(pI, sxI, xI, yI, pP, sxP, syP))
{
pt->x = xI;
pt->y = yI;
return true;
}
}
}
return false;
}
bool isEntry(pI, sxI, xI, yI, pP, sxP, syP)
{
for(yP = 0; yP < syP; yP++)
{
for(xP = 0; xP < sxP; xP++)
{
// самая главная строчка кода :)
if( *(pI + xI + xP + (sxI * yI) + (sxI * yP)) != *(pP + xP + (sxP * yP) ) return false;
}
}
return true;
}
Ну вот и все вроде-бы...