|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Дек 25, 2003 14:54:41 Функции CreatePolyPolygonRgn CreatePolygonRgn Строят HRGN по точкам (грубо) можно ли получить этот HRGN из монохроматической картинки программно |
|
|
Дата: Дек 25, 2003 17:49:02 По моему придется самому сканировать картинку и описывать её как множество прямоугольников, а потом вызвать функцию ExtCreateRegion:
rgn dd 32,0,n,0
dd 0,0,0,0
rect1 dd ?,?,?,?
....
rectn dd ?,?,?,?
invoke ExtCreateRegion,0,32+n*16,rgn
В win9x сделать регион из более чем 4094 прямоугольников не получится(так написано в MSDN). |
|
|
Дата: Дек 27, 2003 13:39:24 Пожалуйсто можно ли по подробней про ExtCreateRegion И про первую и третью структуры (XFORM и RGNDATA). |
|
|
Дата: Дек 27, 2003 14:32:46 · Поправил: Black_mirror _evil Насколько я понял первая структура описывает преобразование для региона(поворот, перенос и сжатие). А вот RGNDATA содержит заголовок и следом за ним N прямоугольников описывающих регион(только почему они описаны как char[1]?!). В заголовке присутствует его длина(32 байта), тип региона(пока может быть только RDH_RECTANGLES), количество прямоугольников в регионе, размер памяти для региона N*sizeof(RECT) (возможно еще нужно длину заголовка прибавить), и прямоугольник ограничивающий регион(похоже что он игнорируется). Точка считается принадлежащей региону если она попадает хотя бы в один из прямоугольников. Самый простой метод получения региона из картинки это пройтись по всем строкам и каждую группу подряд идущих пикселей входящих в регион описать отдельным прямоугольником. Прямоугольники записать в массив, не забыв поместить перед ним заголовок. А затем вызвать ExtCreateRgn. |
|
|
Дата: Дек 27, 2003 15:34:09 _evil Программно можно, но это подразумевает вручную. Ты сам должен написать алгоритм сканирования. Я видел где-то готовое решение со сканированием контура картинки, но уже не припоминаю где именно. Black_mirror А почему именно из прямоугольников? Ведь можно построить его по заданным точкам (т.е. в виде произвольного многоугольника). |
|
|
Дата: Дек 27, 2003 16:29:09 Toxic Тяжело будет картинку превратить во множество полигонов. С прямоугольниками как-то проще. |
|
|
Дата: Дек 27, 2003 17:13:19 Black_mirror Да нет, я не это имел в виду. Картику можно превратить в один полигон, задав сразу все его вершины. Задача сканирования как раз и заключается в нахождении всех вершин полигона. Представь, что тебе надо нарисовать пятиконечную звезду. С помощью CreatePolygonRgn, задав ей 10 точек(вершин), ты решаешь поставленную задачу. А как такое сделать через прямоугольники? |
|
|
Дата: Дек 28, 2003 03:18:26 · Поправил: Black_mirror Toxic Если я точно знаю, что окошко представляет из себя пятиконечную звезду, то конечно я воспользуюсь функцией CreatePolygonRgn. Ну а если это кусок сыра с дырками, а рядом с ним несколько крошек, то как его превратить в ОДИН полигон? |
|
|
Дата: Дек 28, 2003 03:58:31 Black_mirror то как его превратить в ОДИН полигон? В один - никак. Я имел в виду одну(замкнутую) фигуру. Ну а если это кусок сыра с дырками, а рядом с ним несколько крошек Ну, такое окно - это изврат, но и оно имеет право на существование. Значит, ты предлагаешь сканировать каждую строку и добавлять каждый найденный в ней сегмент черного цвета как прямоугольник? Но тогда как быть с ограничением в 4094? У меня сейчас под рукой описание API от 1997 года, так там ничего не сказано про ограничения. Завтра посмотрю в MSDN. Разве нельзя полученный из 4094 прямоугольников hRgn скомбинировать с другим таким же, используя CombineRgn? Тогда задача решается 'на ура'. |
|
|
Дата: Дек 28, 2003 09:07:25 Toxic В win9x ограничение на размер структуры RGNDATA для функции ExtCreateRgn 64К. А 4094 я получил вычтя размер заголовка и поделив на 16(sizeof(RECT)). А с ограничением я предлагаю бороться используя win2000. А для win9x можно порекомендовать только объединять при сканировании одинаковые по длине и расположению отрезки в соседних строках в один прямоугольник. |
|
|
Дата: Дек 29, 2003 01:41:08 Black_mirror А с ограничением я предлагаю бороться используя win2000 Да... Так бы можно было много проблем решить. Но беда в том, что на свете много тупаков, которые, имея достаточные вычислительные ресурсы, все равно сидят под Win98, говоря, что "она надежнее" (!!! =8-0 !!!). |
|
|
Дата: Дек 29, 2003 02:45:55 Я попиксельно сканировал картинку и присоединял нужный регион (1х1 пиксель) к общему региону. Получается долго, но в 9х работало. Вообще-то, я пришел к выводу, что быстрее будет попиксельно удалять части региона. |
|
|
Дата: Дек 29, 2003 03:53:12 Sk. Inc. быстрее будет попиксельно удалять части региона Все зависит от соотношения количества черного к белому. |
|
|
Дата: Дек 29, 2003 06:20:00 Toxic Как правило, нужной части картинки больше, чем ненужной. Иначе бы размер окна был меньше :) У меня где-то пример был для VB6, где обрабатывается картинка и регион создается по прямоугольникам, высотой в 1 пиксель. Если надо, могу поискать. |
|
|
Дата: Дек 29, 2003 06:32:48 Sk. Inc. Спасибо, мне не нужно. Но думаю товарищ _evil будет тебе признателен за аттач. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.088 |