Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

Обход контура в BitMap   Найти похожие ветки 

 
Ozone ©   (2004-09-16 05:37) [0]

Есть некий замкнутый контур черного цвета (толщина = 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;

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


 
Думкин ©   (2004-09-16 06:28) [1]

Тебе в итоге регион создать надо?


 
KilkennyCat ©   (2004-09-16 08:59) [2]

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


а зачем? коли мы знаем координаты, откуда начали, так может, лучше их и помнить?

я бы делал так: выбираем точку на контуре. Проверяем все восемь точек вокруг, при наличии черных, заносим в массив их координаты. закрашиваем ее в красный. берем последнюю точку из массива, уменьшаем его размер на единицу, проверяем все восемь в окружении, найденные черные заносим в массив, текущую закрашиваем. Если в окружении нет больше черных точек,  берем из массива. Если массив кончился - работа выполнена.
Этот алгоритм обработает любой контур, с пересечениями и проч.


 
Ozone ©   (2004-09-16 12:03) [3]

Думкин ©   (16.09.04 06:28) [1]

Угадал :)


 
Ozone ©   (2004-09-16 12:05) [4]

KilkennyCat ©   (16.09.04 08:59) [2]

//а зачем? коли мы знаем координаты, откуда начали, так может, лучше их и помнить?

Угу. Так лучше.
А на счет алгоритма - попробую, спасибо.


 
MBo ©   (2004-09-16 12:08) [5]

>Ozone ©   (16.09.04 12:03) [3]
Так ведь эти точки появились не сами по себе, а в результате рисования прямых и кривых - а значит, получать их вручную не нужно, а использовать функции работы с Path, затем перевести PathToRegion


 
Ozone ©   (2004-09-16 12:19) [6]

MBo ©   (16.09.04 12:08) [5]
? Path

Не разу об этом не слышал? Как это работает?


 
MBo ©   (2004-09-16 12:32) [7]

F1 Path functions в MSDN или SDKHelp ;)


 
Ozone ©   (2004-09-16 13:11) [8]

MBo ©   (16.09.04 12:32) [7]

Спасиб.


 
[lamer]Barmaglot ©   (2004-09-16 13:39) [9]

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


 
Ozone ©   (2004-09-16 13:40) [10]

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

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


 
[lamer]Barmaglot ©   (2004-09-16 13:51) [11]

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

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


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

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

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


 
Ozone ©   (2004-09-20 12:05) [13]

KilkennyCat ©   (16.09.04 08:59) [2]

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


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

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


 
Ozone ©   (2004-09-20 15:15) [15]

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


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

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


 
Ozone ©   (2004-09-21 06:37) [17]

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

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


 
Ozone ©   (2004-09-21 06:39) [18]

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

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


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

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


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

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


 
Ozone ©   (2004-09-22 12:42) [21]

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

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


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

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


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

wicked ©   (22.09.04 15:41) [22]

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


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

anonimshchik@mai.ru

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


 
wicked ©   (2004-09-23 12:42) [25]

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


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

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

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


 
Ozone ©   (2004-09-24 06:10) [27]

wicked ©   (23.09.04 12:42) [25]

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



Страницы: 1 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
4-1099583763
heady
2004-11-04 18:56
2004.12.19
И снова выбор каталога


14-1101756973
_none_
2004-11-29 22:36
2004.12.19
>Почему у Microsoft ничего не выйдет с .Net


3-1100854084
Lamer_Of_Delphi
2004-11-19 11:48
2004.12.19
Хранимая проца...


1-1101908075
gek1
2004-12-01 16:34
2004.12.19
ListBox. Скроллинг по горизонтали


11-1084189550
Yustas
2004-05-10 15:45
2004.12.19
Иконка приложения