Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

Обход контура в 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 вся ветка

Форум: "Media";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.033 c
14-1101575378
Petia
2004-11-27 20:09
2004.12.19
Анкета


4-1099408506
TSoftMan
2004-11-02 18:15
2004.12.19
Расширения и программы


9-1092598064
Knoxville
2004-08-15 23:27
2004.12.19
Программа чтения игр от PlayStation


6-1097079906
ДАНИИЛ
2004-10-06 20:25
2004.12.19
СТАРТОВАЯ СТРАНИЦА


3-1101039314
Sid
2004-11-21 15:15
2004.12.19
Как в сетке DBCtrlGrid отобразить данные из двух таблиц?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский