Форум: "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