![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обход контура в BitMap [D4, WinXP]
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]
Спасиб.