Re[4]: как сделать поиск одного битмапа в другом?
От: IgorK Россия  
Дата: 06.06.02 09:00
Оценка:
Здравствуйте Аноним, Вы писали:

А>вот здесь мне очень интересно как учитывать геометрические параметры. Судя по 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;
}



Ну вот и все вроде-бы...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.