Работа с графикой
Работа с графикой
1) Сделал простенький тест (во вложении), просто чтобы проверить как работает. Там на картинку отрисовываются точки выбранного цвета в случайных местах. Но спустя небольшое время начинаются тормоза. При этом также линейно увеличивается память, занимаемая (VI properties). Я так понимаю, это из-за того, что при каждом отображении картинки выполняются все команды рисования, которые были произведены с ней до этого, ведь графика тут векторная?
2) Как тогда сделать, чтобы картинка хранилась в памяти как есть, в растровом виде, чтобы каждое новое рисование в неё не приводило к увеличению занимаемой памяти и этим тормозам?
3) Как убрать рамку вокруг картинки? Пробовал Customize, но там не получается удалять элементы... Можно ли вообще просто рисовать в произвольные координаты лицевой панели?
4) Есть ли возможности сделать рисуемые линии и фигуры без зазубрин (anti-aliasing)?
2) Как тогда сделать, чтобы картинка хранилась в памяти как есть, в растровом виде, чтобы каждое новое рисование в неё не приводило к увеличению занимаемой памяти и этим тормозам?
3) Как убрать рамку вокруг картинки? Пробовал Customize, но там не получается удалять элементы... Можно ли вообще просто рисовать в произвольные координаты лицевой панели?
4) Есть ли возможности сделать рисуемые линии и фигуры без зазубрин (anti-aliasing)?
- Вложения
-
- Graphics.vi
- (11.3 КБ) 163 скачивания
Race conditions - опасный и скользкий баг!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с графикой
1) Примерно так, взгляните на эту картинку: http://labviewportal.org/viewtopic.php?p=63414#p63414 и поймёте, почему так происходит.
2) Рисовать не с помощью стандартных , а вручную на пикселях массива, т.е. заменять в массиве те пиксели, которые требуется закрасить, на пиксели нужного цвета, примерно так, как в теме выше. Только там в исходной картинке заменяются пиксели на пиксели склеиваемой картинки. Ну или сбрасывать картинку в файл, а потом читать из файла, но это накладная операция в плане производительности, и здесь будет вносить вклад задержка записи на жесткий диск и последующего чтения. Ещё вариант - переходить на NI Vision, там есть инструменты, рисующие сразу на пикселях картинки. Но я бы вам посоветовал поменять архитектуру приложения так, чтобы рисование не выполнялось с большой частотой и в одно и то же место, а только по желанию пользователя или по какому-то внешнему условию.
3) Customize, там выбираете прозрачный цвет на панели Tools и кистью закрашиваете рамку. Рисовать на FP я не пробовал, честно говоря, в прочих IDE можно было рисовать на форме, но панель имеет мало общего с окнами Windows, разве что получить HWND и затем DC, а потом попробовать на канве что-то изобразить... Если будет свободное время, попробую и сообщу.
4) Если фигуры не строго вертикально/горизонтально расположены, всё равно ведь будет видно переход между пикселями, т.к. они представлены в виде квадратов. Можно просто сделать увеличение изображения до таких размеров, когда пиксели не видны, точнее сливаются визуально.
2) Рисовать не с помощью стандартных , а вручную на пикселях массива, т.е. заменять в массиве те пиксели, которые требуется закрасить, на пиксели нужного цвета, примерно так, как в теме выше. Только там в исходной картинке заменяются пиксели на пиксели склеиваемой картинки. Ну или сбрасывать картинку в файл, а потом читать из файла, но это накладная операция в плане производительности, и здесь будет вносить вклад задержка записи на жесткий диск и последующего чтения. Ещё вариант - переходить на NI Vision, там есть инструменты, рисующие сразу на пикселях картинки. Но я бы вам посоветовал поменять архитектуру приложения так, чтобы рисование не выполнялось с большой частотой и в одно и то же место, а только по желанию пользователя или по какому-то внешнему условию.
3) Customize, там выбираете прозрачный цвет на панели Tools и кистью закрашиваете рамку. Рисовать на FP я не пробовал, честно говоря, в прочих IDE можно было рисовать на форме, но панель имеет мало общего с окнами Windows, разве что получить HWND и затем DC, а потом попробовать на канве что-то изобразить... Если будет свободное время, попробую и сообщу.
4) Если фигуры не строго вертикально/горизонтально расположены, всё равно ведь будет видно переход между пикселями, т.к. они представлены в виде квадратов. Можно просто сделать увеличение изображения до таких размеров, когда пиксели не видны, точнее сливаются визуально.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Работа с графикой
Дело в том, что Picture это список команд. Естественно, каждая точка - это доп команда. Поэтому рекомендую хранить не список точек, а содержимое.
Re: Работа с графикой
Это не решение. Например, надо сделать мнемосхему, элементы которой меняют вид при определённых событиях, то есть на картинку рисуется тот или иной фрагмент, закрашивая то, что было под ним. Получается тогда, что чем больше программа работает, тем больше занимаемая память, и сильнее тормоза.Но я бы вам посоветовал поменять архитектуру приложения так, чтобы рисование не выполнялось с большой частотой и в одно и то же место, а только по желанию пользователя или по какому-то внешнему условию
Вообще, во всех средах программирования, с которыми работал до этого, картинка хранилась в памяти просто как есть, подобно обычному bmp, и рисовать на ней можно сколько угодно, это не приводило к увеличению занимаемой памяти, просто перерисовывались определённые пиксели, и всё. (bmp и так память жрёт неслабо ) Вообще, зачем в сделана такая байда? Зачем картинке "помнить" всё, что было проделано на ней? Ведь возможности отменить или изменить уже нарисованные фигуры, как я понял, нет? И где тогда преимущества векторной графики в ?
Так для этого и разработана технология anti-aliasing, которая сглаживает зазубрины путём подгона нужных оттенков у соседних пикселей. И с ней всё выглядит на порядок глаже и симпатичнее.Если фигуры не строго вертикально/горизонтально расположены, всё равно ведь будет видно переход между пикселями, т.к. они представлены в виде квадратов. Можно просто сделать увеличение изображения до таких размеров, когда пиксели не видны, точнее сливаются визуально.
Это, как сами понимаете, вообще не вариант, а извращениеНу или сбрасывать картинку в файл, а потом читать из файла, но это накладная операция в плане производительности, и здесь будет вносить вклад задержка записи на жесткий диск и последующего чтения.
Последний раз редактировалось Boris_K 17 апр 2015, 18:32, всего редактировалось 5 раз.
Race conditions - опасный и скользкий баг!
Re: Работа с графикой
Подозревал, что тут нужно работать именно с flattened, пробовал, но что-то не сросталось... Спасибо, за Ваш пример, буду на работе, попробую.Поэтому рекомендую хранить не список точек, а содержимое.
Race conditions - опасный и скользкий баг!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с графикой
Кстати, это легко увидеть с помощью Flatten To String: 4 байта - длина всей строки: 0xA4 (164)Borjomy_1 писал(а):Дело в том, что Picture это список команд.
2 байта - код команды: 0x1D (29) - copy pixmap
4 байта - длина заголовка вместе с пиксельными данными: 0x7C (124)
4 байта - длина массива пикселей: 0x64 (100)
8 байт - кластер "ограничивающий прямоугольник" (left, top, right, bottom): 0, 0, 0xA (10), 0xA (10)
2 байта - глубина цвета: 8 бит
4 байта - дефолтный цвет переднего плана
4 байта - дефолтный цвет заднего плана
2 байта - таблица цветов: 0 - в данном случае её нет
Дальше пошли данные для команды "copy pixmap". Вообще, все операции с Picture открыты, так что можно заглянуть внутрь и разобраться, например, в Draw Flattened Pixmap формируется структура команды, описанной выше. По БД ясно это видно.
Также есть вот такие интересные - Picture Hacks. С их помощью можно посмотреть, как Picture может быть преобразован(а) в строку и обратно, а также наиболее распространённые команды.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с графикой
Undo вы можете сами реализовать - структура Picture открыта для изучения. Сам по себе контрол Picture - довольно старая технология, и между версиями особенно не менялся. Видимо, раньше оказалось проще реализовать запись/чтение именно в векторном формате. Насчёт остального ответ был уже дан - ставьте Vision и используйте для работы с пикселями, получите то, что нужно. Опять же, в Vision'е есть различные фильтры, в т.ч. и сглаживающие. Если нет возможности поставить Vision, то реализуйте замену пикселей в массиве по имеющимся наработкам (если они есть) или с нуля.Boris_K писал(а):Вообще, зачем в сделана такая байда? Зачем картинке "помнить" всё, что было проделано на ней? Ведь возможности отменить или изменить уже нарисованные фигуры, как я понял, нет? И где тогда преимущества векторной графики в ?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с графикой
Получилось. Правда не интуитивно понятно при первом взгляде, но имеет право на жизнь. Диаграмма малость громоздкая вышла. VI: За основу был взят вот этот пример.dadreamer писал(а):получить HWND и затем DC, а потом попробовать на канве что-то изобразить
Последний раз редактировалось dadreamer 18 апр 2015, 01:10, всего редактировалось 1 раз.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Работа с графикой
посмотреть сейчас не получится... а что получается, когда окно сворачивается-разворачивается? Изображение перерисовывается?Получилось. Правда не интуитивно понятно при первом взгляде, но имеет право на жизнь.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с графикой
Не перерисовывается совсем Так же и при сдвиге окна за пределы экрана. Следовало подобного ожидать в общем-то. Нужно ручками перерисовывать.Borjomy_1 писал(а):Изображение перерисовывается?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с графикой
Добавил перерисовку контекста при поступлении сообщений WM_PAINT и WM_LBUTTONUP.
- Вложения
-
- Draw On FP 2.rar
- lv2011
- (192.52 КБ) 111 скачиваний
Re: Работа с графикой
Спасибо. И не лень вам было столько воротить?
Что такое DC ?
Что такое DC ?
Race conditions - опасный и скользкий баг!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с графикой
Boris_K,
http://www.cyberguru.ru/programming/vis ... ?showall=1
http://www.vsokovikov.narod.ru/New_MSDN ... _getdc.htm
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
+ кроме того, в теме на ni.com выше хорошо написано.
Когда занятие интересное, то не лень. Любопытство берёт верх, хочется увидеть результат.
http://www.cyberguru.ru/programming/vis ... ?showall=1
http://www.vsokovikov.narod.ru/New_MSDN ... _getdc.htm
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
+ кроме того, в теме на ni.com выше хорошо написано.
Когда занятие интересное, то не лень. Любопытство берёт верх, хочется увидеть результат.
Re: Работа с графикой
Сделал по вашему примеру, то есть через сдвиговые регистры передаётся содержимое. Всё отлично, тормоза пропали, и память не растёт. Но нельзя ли как-то уменьшить занимаемую память? Например, при картинке 250 * 250 имеет в памяти данные размером 750 кБ, тогда как такая картинка в bmp весит всего 184 кБ, то есть в 4 раза меньше. Что-то неоправданно много памяти отжирается.Borjomy_1 писал(а):Дело в том, что Picture это список команд. Естественно, каждая точка - это доп команда. Поэтому рекомендую хранить не список точек, а содержимое.
Race conditions - опасный и скользкий баг!
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Работа с графикой
Зачем? Приступ перфекционизма? Исполняемый файл средней сложности программы занимает в памяти не меньше 100Мб. На этом фоне даже лишних 10 Мб вы не заметите.Но нельзя ли как-то уменьшить занимаемую память?
Дело еще в том, что это расход памяти на несколько последовательных операций. Что-то вроде 3 блока по 250кБ, выделяемых в разных функциях. Вполне может быть необходимый минимум.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 16 Ответы
- 3262 Просмотры
-
Последнее сообщение Artem.spb
-
- 4 Ответы
- 220 Просмотры
-
Последнее сообщение Andrew Lunev