Работа с графикой

Простейшие вопросы в области инженерной разработки
Ответить
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Работа с графикой

Сообщение Boris_K »

1) Сделал простенький тест (во вложении), просто чтобы проверить как работает. Там на картинку отрисовываются точки выбранного цвета в случайных местах. Но спустя небольшое время начинаются тормоза. При этом также линейно увеличивается память, занимаемая :vi: (VI properties). Я так понимаю, это из-за того, что при каждом отображении картинки выполняются все команды рисования, которые были произведены с ней до этого, ведь графика тут векторная?

2) Как тогда сделать, чтобы картинка хранилась в памяти как есть, в растровом виде, чтобы каждое новое рисование в неё не приводило к увеличению занимаемой памяти и этим тормозам?

3) Как убрать рамку вокруг картинки? Пробовал Customize, но там не получается удалять элементы... Можно ли вообще просто рисовать в произвольные координаты лицевой панели?

4) Есть ли возможности сделать рисуемые линии и фигуры без зазубрин (anti-aliasing)?
Вложения
Graphics.vi
(11.3 КБ) 163 скачивания
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Работа с графикой

Сообщение dadreamer »

1) Примерно так, взгляните на эту картинку: http://labviewportal.org/viewtopic.php?p=63414#p63414 и поймёте, почему так происходит.
2) Рисовать не с помощью стандартных :vi: , а вручную на пикселях массива, т.е. заменять в массиве те пиксели, которые требуется закрасить, на пиксели нужного цвета, примерно так, как в теме выше. Только там в исходной картинке заменяются пиксели на пиксели склеиваемой картинки. Ну или сбрасывать картинку в файл, а потом читать из файла, но это накладная операция в плане производительности, и здесь будет вносить вклад задержка записи на жесткий диск и последующего чтения. Ещё вариант - переходить на NI Vision, там есть инструменты, рисующие сразу на пикселях картинки. Но я бы вам посоветовал поменять архитектуру приложения так, чтобы рисование не выполнялось с большой частотой и в одно и то же место, а только по желанию пользователя или по какому-то внешнему условию.
3) Customize, там выбираете прозрачный цвет на панели Tools и кистью закрашиваете рамку. Рисовать на FP я не пробовал, честно говоря, в прочих IDE можно было рисовать на форме, но панель :labview: имеет мало общего с окнами Windows, разве что получить HWND и затем DC, а потом попробовать на канве что-то изобразить... Если будет свободное время, попробую и сообщу.
4) Если фигуры не строго вертикально/горизонтально расположены, всё равно ведь будет видно переход между пикселями, т.к. они представлены в виде квадратов. Можно просто сделать увеличение изображения до таких размеров, когда пиксели не видны, точнее сливаются визуально.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Работа с графикой

Сообщение Borjomy_1 »

Дело в том, что Picture это список команд. Естественно, каждая точка - это доп команда. Поэтому рекомендую хранить не список точек, а содержимое.
Вложения
Рисование точек.png
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Работа с графикой

Сообщение Boris_K »

Но я бы вам посоветовал поменять архитектуру приложения так, чтобы рисование не выполнялось с большой частотой и в одно и то же место, а только по желанию пользователя или по какому-то внешнему условию
Это не решение. Например, надо сделать мнемосхему, элементы которой меняют вид при определённых событиях, то есть на картинку рисуется тот или иной фрагмент, закрашивая то, что было под ним. Получается тогда, что чем больше программа работает, тем больше занимаемая память, и сильнее тормоза.

Вообще, во всех средах программирования, с которыми работал до этого, картинка хранилась в памяти просто как есть, подобно обычному bmp, и рисовать на ней можно сколько угодно, это не приводило к увеличению занимаемой памяти, просто перерисовывались определённые пиксели, и всё. (bmp и так память жрёт неслабо :brows: ) Вообще, зачем в :labview: сделана такая байда? Зачем картинке "помнить" всё, что было проделано на ней? Ведь возможности отменить или изменить уже нарисованные фигуры, как я понял, нет? И где тогда преимущества векторной графики в :labview: ?
Если фигуры не строго вертикально/горизонтально расположены, всё равно ведь будет видно переход между пикселями, т.к. они представлены в виде квадратов. Можно просто сделать увеличение изображения до таких размеров, когда пиксели не видны, точнее сливаются визуально.
Так для этого и разработана технология anti-aliasing, которая сглаживает зазубрины путём подгона нужных оттенков у соседних пикселей. И с ней всё выглядит на порядок глаже и симпатичнее.
Ну или сбрасывать картинку в файл, а потом читать из файла, но это накладная операция в плане производительности, и здесь будет вносить вклад задержка записи на жесткий диск и последующего чтения.
Это, как сами понимаете, вообще не вариант, а извращение :crazy:
Последний раз редактировалось Boris_K 17 апр 2015, 18:32, всего редактировалось 5 раз.
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Работа с графикой

Сообщение Boris_K »

Поэтому рекомендую хранить не список точек, а содержимое.
Подозревал, что тут нужно работать именно с flattened, пробовал, но что-то не сросталось... Спасибо, за Ваш пример, буду на работе, попробую.
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Работа с графикой

Сообщение dadreamer »

Borjomy_1 писал(а):Дело в том, что Picture это список команд.
Кстати, это легко увидеть с помощью Flatten To String:
2015-04-17_19-57-28.jpg
2015-04-17_19-56-12.jpg
Untitled 1.vi
lv2011
(8.68 КБ) 90 скачиваний
4 байта - длина всей строки: 0xA4 (164)
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 открыты, так что можно заглянуть внутрь :vi: и разобраться, например, в Draw Flattened Pixmap формируется структура команды, описанной выше. По БД ясно это видно.
Также есть вот такие интересные :vi: - Picture Hacks. С их помощью можно посмотреть, как Picture может быть преобразован(а) в строку и обратно, а также наиболее распространённые команды.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Работа с графикой

Сообщение dadreamer »

Boris_K писал(а):Вообще, зачем в :labview: сделана такая байда? Зачем картинке "помнить" всё, что было проделано на ней? Ведь возможности отменить или изменить уже нарисованные фигуры, как я понял, нет? И где тогда преимущества векторной графики в :labview: ?
Undo вы можете сами реализовать - структура Picture открыта для изучения. Сам по себе контрол Picture - довольно старая технология, и между версиями особенно не менялся. Видимо, раньше оказалось проще реализовать запись/чтение именно в векторном формате. Насчёт остального ответ был уже дан - ставьте Vision и используйте :vi: для работы с пикселями, получите то, что нужно. Опять же, в Vision'е есть различные фильтры, в т.ч. и сглаживающие. Если нет возможности поставить Vision, то реализуйте замену пикселей в массиве по имеющимся наработкам (если они есть) или с нуля.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Работа с графикой

Сообщение dadreamer »

dadreamer писал(а):получить HWND и затем DC, а потом попробовать на канве что-то изобразить
Получилось. Правда не интуитивно понятно при первом взгляде, но имеет право на жизнь.
2015-04-17_23-50-58.jpg
2015-04-17_23-50-58.jpg (49.62 КБ) 6606 просмотров
Диаграмма малость громоздкая вышла. :D
2015-04-17_23-54-27.jpg
VI:
Draw on FP.vi
lv2011
(15.49 КБ) 110 скачиваний
За основу был взят вот этот пример.
Последний раз редактировалось dadreamer 18 апр 2015, 01:10, всего редактировалось 1 раз.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Работа с графикой

Сообщение Borjomy_1 »

Получилось. Правда не интуитивно понятно при первом взгляде, но имеет право на жизнь.
посмотреть сейчас не получится... а что получается, когда окно сворачивается-разворачивается? Изображение перерисовывается?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Работа с графикой

Сообщение dadreamer »

Borjomy_1 писал(а):Изображение перерисовывается?
Не перерисовывается совсем Изображение Так же и при сдвиге окна за пределы экрана. Следовало подобного ожидать в общем-то. Нужно ручками перерисовывать.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Работа с графикой

Сообщение dadreamer »

Добавил перерисовку контекста при поступлении сообщений WM_PAINT и WM_LBUTTONUP.
Вложения
Draw On FP 2.rar
lv2011
(192.52 КБ) 111 скачиваний
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Работа с графикой

Сообщение Boris_K »

Спасибо. И не лень вам было столько воротить?

Что такое DC ?
Race conditions - опасный и скользкий баг!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Работа с графикой

Сообщение dadreamer »

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 выше хорошо написано.

Когда занятие интересное, то не лень. Любопытство берёт верх, хочется увидеть результат. :crazy:
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Версия LabVIEW: 2012 Pro

Re: Работа с графикой

Сообщение Boris_K »

Borjomy_1 писал(а):Дело в том, что Picture это список команд. Естественно, каждая точка - это доп команда. Поэтому рекомендую хранить не список точек, а содержимое.
Сделал по вашему примеру, то есть через сдвиговые регистры передаётся содержимое. Всё отлично, тормоза пропали, и память не растёт. Но нельзя ли как-то уменьшить занимаемую память? Например, при картинке 250 * 250 :vi: имеет в памяти данные размером 750 кБ, тогда как такая картинка в bmp весит всего 184 кБ, то есть в 4 раза меньше. Что-то неоправданно много памяти отжирается.
Race conditions - опасный и скользкий баг!
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Работа с графикой

Сообщение Borjomy_1 »

Но нельзя ли как-то уменьшить занимаемую память?
Зачем? Приступ перфекционизма? Исполняемый файл средней сложности программы занимает в памяти не меньше 100Мб. На этом фоне даже лишних 10 Мб вы не заметите.
Дело еще в том, что это расход памяти на несколько последовательных операций. Что-то вроде 3 блока по 250кБ, выделяемых в разных функциях. Вполне может быть необходимый минимум.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»