Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обход контура в BitMap [D4, WinXP]


Страницы:   1 2

Ozone ©   (2004-09-16 05:37:00) 

Есть некий замкнутый контур черного цвета (толщина = 1 пиксель) нарисованный на BitMap. Необходимо его обойти и раскрасить, к примеру, красным цветом.

Написал такую процедурку, но она работает не до конца (т.е. обходит только часть)


type
   TDirect = array [0..7, 0..1] of integer;
// т.е. 8 направлений обхода
const
   Locate : TDirect = ( (0,-1), (1,-1), (1,0), (1,1), (0,1), (-1,1), (-1,0), (-1,-1) );
procedure Test(p: TPoint; bmp: TBitMap; loct: integer;
 var count: integer);
var
  i : 0..7;
  flg: boolean;
  tmp_loct: integer;
begin

    if (bmp.Canvas.Pixels[p.x,p.y] = clWhite) then exit;

    // Ставим белую точку чтобы остановиться когда обойдем все
    if count = 0 then bmp.Canvas.Pixels[p.x,p.y] := clWhite;

    inc(count);

    bmp.Canvas.Pixels[p.x, p.y] := clRed;

    // "говорим" откуда пришли, чтобы он не смотрел туда
    tmp_loct := loct + 4;
    if tmp_loct > 7 then dec(tmp_loct,8);

    for i:=0 to 7 do
      if tmp_loct <> i then
        if bmp.Canvas.Pixels[p.x + Locate[i,0], p.y + Locate[i,1]] = clBlack then begin
          Test(Point(p.x + Locate[i,0], p.y + Locate[i,1]),bmp, i, count);
          break;
        end;
end;


// Ну и вызываю так

begin
    { здесь нахожу точку принадлежащию контуру - записываю ее в Point: TPoint}
    count := 0;
    Test(Point, bmp, 0, count);
    {...}
end;

Что я неправильно делаю? Может есть другой способ?


Ozone   (2004-09-24 06:10:00) [1]

wicked ©   (23.09.04 12:42) [25]

Да я собственно так и сделал :)


Думкин   (2004-09-23 12:44:00) [2]

> [25] wicked ©   (23.09.04 12:42)

Только т.к. у него внутренности пустые, то с невыпуклыми надо работать очень аккуратно.


wicked   (2004-09-23 12:42:00) [3]

> Ozone [23]
через CreateRectRgn и CombineRgn... соответственно, прямоугольники для CreateRectRgn будут высотой в 1 пиксель....
как вариант, можно анализировать соседние скан-линии, и если левая и правая границы совпадают, то строить на них один прямоугольник....


Аноним   (2004-09-23 12:29:00) [4]

anonimshchik@mai.ru

А метод жука ищи в поисковиках


Ozone   (2004-09-23 07:42:00) [5]

wicked ©   (22.09.04 15:41) [22]

А как ты потом по этим точкам собираешься регион строить?


wicked   (2004-09-22 15:41:00) [6]

а просканировать битмап на наличие черных точек?...
проблема будт только в том, что легче всего таким образом получить выпуклый (convex) контур....


Ozone   (2004-09-22 12:42:00) [7]

Аноним   (21.09.04 20:41) [19]

У меня не сохранился твой mail... :(


Аноним   (2004-09-21 20:44:00) [8]

Если сильно нужно, пиши письмом, почту смотрю.


Аноним   (2004-09-21 20:41:00) [9]

Да, меня кто-то, возможно, модератор, заставил переименоваться, заодно вписав в анкету какой-то гадости. Выйти на связб не могу, офис сейчас переезжает, я по городу бегаю.


Ozone   (2004-09-21 06:39:00) [10]

Аноним   (20.09.04 16:46) [16]

<offtop>
Ты слчайно не бывший "Анонимщик"? Выйди пжлст со мной на связь... ICQ 287672211
</offtop>


Ozone   (2004-09-21 06:37:00) [11]

Аноним   (20.09.04 16:46) [16]

<offtop>
Делаю лабу по ТРПО :)
</offtop>


Аноним   (2004-09-20 16:46:00) [12]

Чем ты там снова, интересно, занимаешься?


Ozone   (2004-09-20 15:15:00) [13]

Аноним   (20.09.04 13:19) [14]
А принцип его?


Аноним   (2004-09-20 13:19:00) [14]

Есть метод жука


Ozone   (2004-09-20 12:05:00) [15]

KilkennyCat ©   (16.09.04 08:59) [2]

Попробовал твой алгоритм - если ширина контура >= 2 пикселей, то контур "закрашивается" не последовательно...


Ozone   (2004-09-16 13:59:00) [16]

[lamer]Barmaglot ©   (16.09.04 13:51) [11]

Мне регион получить нужно в итоге...


[lamer]Barmaglot   (2004-09-16 13:51:00) [17]

то Ozone ©   (16.09.04 13:40) [10]

А Вам контур зачем нужен, для прозрачности или еще для чего? Для прозрачности маска проще...


Ozone   (2004-09-16 13:40:00) [18]

[lamer]Barmaglot ©   (16.09.04 13:39) [9]

Как я получу при этом координаты точек контура?


[lamer]Barmaglot   (2004-09-16 13:39:00) [19]

Мбр... А не проще наложить черное изображение на другое изображение как маску (так в иконках прозрачность делают)???


Ozone   (2004-09-16 13:11:00) [20]

MBo ©   (16.09.04 12:32) [7]

Спасиб.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо