Загрузить png из памяти
Загрузить png из памяти
В проекте используется своя графика, выводимая программно в Picture indicator. Есть исходные ресурсы - png-картинки, загружаемые при старте программы (нужно работать из .exe). Нужно защитить и скрыть эти картинки - сшить в один файл ресурсов. Проблема в том, как потом загружать png прямо из памяти - ведь Read PNG file принимает только путь к файлу, поэтому в программе пришлось бы вываливать готовые png на диск, считывать и тут же удалять. Как бы отлично работает, но ясно что вариант это черезж..пный. Можно ли как-то загрузить png прямо из памяти, то есть с массива?
Race conditions - опасный и скользкий баг!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Загрузить png из памяти
Можно: https://forums.ni.com/t5/Machine-Vision ... 705#M51129Boris_K писал(а):Можно ли как-то загрузить png прямо из памяти, то есть с массива?
Re: Загрузить png из памяти
dadreamer, спасибо за вариант.
Borjomy_1, то есть просто скопировать кластер Image data в константу на БД? Но тогда графика будет храниться прямо в exe и в несжатом виде, и второе явно плохо.
Borjomy_1, то есть просто скопировать кластер Image data в константу на БД? Но тогда графика будет храниться прямо в exe и в несжатом виде, и второе явно плохо.
Race conditions - опасный и скользкий баг!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Загрузить png из памяти
Я проблем не встречал, использовал на W7, 8.1 и 10 (32/64 бита ОСь и LV). На Vista и XP тоже должно работать, начиная с SP3.Boris_K писал(а):dadreamer, спасибо за вариант. Вроде не должно быть проблем с работоспособностью на разных машинах?
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Загрузить png из памяти
А Вы пробовали при создании exe, указывать Destination картинок прямо в exe файл? Тогда просто так с файловой системы их не открыть, они будут внутри exе. Вроде бы можно такое провернуть... А в самой программе использовать Conditional Disable Structure, и при Run-Time Engine = False читать их с диска (при разработке и тестировании), а при Run-Time Engine = True читать их по пути типа ...SomeApplicationName.exe\data\Picture.png, и т.д.Boris_K писал(а):В проекте используется своя графика, выводимая программно в Picture indicator. Есть исходные ресурсы - png-картинки, загружаемые при старте программы (нужно работать из .exe). Нужно защитить и скрыть эти картинки - сшить в один файл ресурсов.
Для пущей безопасности, сами файлы можете "закодировать", или сжать в архив (функции от OpenG Toolkit позволяют это легко сделать)...
Мы делили апельсин - много наших полегло...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Загрузить png из памяти
Как именно это сделать? Я попробовал, но после билда картинка помещается в папку data, а не вовнутрь экзешника. Что сделал: добавил картинку в проект, на вкладке Source Files поместил её в Always Included. На вкладке Source File Settings не даёт указать .exe в качестве Destination. На форумах NI вроде тоже пишут, что в папку data только можно помещать.Kosist писал(а):А Вы пробовали при создании exe, указывать Destination картинок прямо в exe файл? Тогда просто так с файловой системы их не открыть, они будут внутри exе. Вроде бы можно такое провернуть...
А это крайне хорошая идея, т.к. практически всегда на любую защиту находится дырка для её обхода. Если кто-то захочет вытянуть картинки из вашей проги, он это сделает (при наличии прямых рук и мозгов). Можно только усложнить хакеру задачу. Для этого картинки стоит зашифровать чем-то наподобие Blowfish, AES или аналогичным криптоалгоритмом. После этого картинки можно достать, либо подобрав криптографический ключ (что займет многие годы на современном железе), либо детально разобравшись в структуре данных внутри экзешника (что потребует серьёзных знаний реверс-инжиниринга). Можно, конечно, картинку вытащить тупо из памяти, когда она будет отображена на панели - ну, тут уж никакая защита не спасёт.Kosist писал(а):Для пущей безопасности, сами файлы можете "закодировать", или сжать в архив (функции от OpenG Toolkit позволяют это легко сделать)...
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Загрузить png из памяти
Что же так сложно все :)
PNG Data to LV Image VI
http://zone.ni.com/reference/en-XX/help ... _pngtoimg/
PNG Data to LV Image VI
http://zone.ni.com/reference/en-XX/help ... _pngtoimg/
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Загрузить png из памяти
Зато универсально А если автор захочет изменить формат изображений на JPEG или BMP? В ведь нет функции BMP/JPEG To LV Image (есть только идея на Idea Exchange).Blackman писал(а):Что же так сложно все :)
Re: Загрузить png из памяти
Попробовал, аналогично.dadreamer писал(а):Как именно это сделать? Я попробовал, но после билда картинка помещается в папку data, а не вовнутрь экзешника. Что сделал: добавил картинку в проект, на вкладке Source Files поместил её в Always Included. На вкладке Source File Settings не даёт указать .exe в качестве Destination. На форумах NI вроде тоже пишут, что в папку data только можно помещать.
Blackman, спасибо! Во куда они запихали этот ! Я конечно понимаю что Web-сервисы и "Portable network graphics" немного связаны. Немного. Но могли же они добавить этот и в палитры работы с графикой.
Race conditions - опасный и скользкий баг!
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Загрузить png из памяти
Простите, дурака - хотя и писал, что "вроде бы это можно", но не был до конца уверен... Даже создание Build Destination вручную (с путем к екзе) не помогает.dadreamer писал(а):Как именно это сделать? Я попробовал, но после билда картинка помещается в папку data, а не вовнутрь экзешника. Что сделал: добавил картинку в проект, на вкладке Source Files поместил её в Always Included. На вкладке Source File Settings не даёт указать .exe в качестве Destination. На форумах NI вроде тоже пишут, что в папку data только можно помещать.
Хотя, если поиграться - то можно обхитрить LabVIEW, вопрос лишь нужно ли это... На форуме уже ведь обсуждали, как "открыть" екзешник; и что при билде LabVIEW создает вначале архив, а затем как-то его перепаковывает в екзе. Может можно "на лету" во время билда "впихнуть" картинку внутрь архива? Но, скорее всего, компайлер заметит "махинации", и не закончит билд успешно...
Мы делили апельсин - много наших полегло...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Загрузить png из памяти
Это уже из области фантастики. Потребуется переписать для билдинга, что не самая простая затея. Или написать перепаковщик готовых .exe, но это тоже тот ещё гемор, т.к. llb в зашифрованном виде хранится (хотя я дешифратор как-то писал уже, но для FFF он непригоден).Kosist писал(а):Может можно "на лету" во время билда "впихнуть" картинку внутрь архива? Но, скорее всего, компайлер заметит "махинации", и не закончит билд успешно...
Теоретически есть возможность хранить что угодно внутри в виде ресурса или в тэгах . Естественно, работа с ними должна осуществляться только из-под , т.к. другие приложения просто не смогут разобрать формат данных.
Re: Загрузить png из памяти
Попробовал хранить данные картинки прямо на БД в виде строковой константы - всё ок, размер увеличивается только на размер png-файла. Но стоит ту константу хоть как-то заюзать - даже просто подключить к ней индикатор - и размер разбухает в 2 раза. Видимо создаётся копия данных и зачем-то сохраняется в файле . Но с exe всё нормально. Тем не менее, с чем может быть связано, можно ли как-то вылечить?
Race conditions - опасный и скользкий баг!
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Загрузить png из памяти
Вряд ли это реально вылечить. Если константа не подключена на БД, то она фигурирует только в графе диаграммы, т.е. в скомпилированном коде её нет (галочки "Disconnect ..." в свойствах билда это обеспечивают). Если константу подключили, то она участвует в коде и при компиляции тоже попадает в "выхлоп" компилятора, потому и сохраняется в двух ресурсах. Это мои предположения, могу где-то и ошибиться.Boris_K писал(а):Попробовал хранить данные картинки прямо на БД в виде строковой константы - всё ок, размер увеличивается только на размер png-файла. Но стоит ту константу хоть как-то заюзать - даже просто подключить к ней индикатор - и размер разбухает в 2 раза. Видимо создаётся копия данных и зачем-то сохраняется в файле . Можно ли как-то вылечить? С exe пока не пробовал, но подозреваю что будет так же.
В .exe диаграмм у нет, так что константа сохраняется только в скомпилированном коде.Boris_K писал(а):Но с exe всё нормально.
Попробуйте VI Tags, см. пример от Blackman по ссылке выше. Для использования тэгов вам понадобится пара вспомогательных самодельных : Write Image(s) to VI и Read Image(s) from VI (условно).
Алгоритм примерно такой:
Write Image(s) to VI:
1. Открывается целевой ;
2. В тэг с некоторым уникальным именем пишется изображение (предварительно загруженное из файла) в бинарном виде;
3. сохраняется;
4. закрывается.
Read Image(s) from VI:
1. Открывается целевой ;
2. Из тэга с некоторым уникальным именем читается изображение в бинарном виде, если нужно, отображается на индикаторе/пишется в стандартный файл;
3. закрывается
Конечно, придётся вставить эти два в проект и таскать их вместе с основным . Можно, при желании, совместить оба в менеджер изображений.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Загрузить png из памяти
Я не понимаю, из чего проблема?
Либо картинка слишком уникальная, например со стега....
Что мешает сделать скрины работающей программы, и слямзить эти самые картинки....
Либо картинка слишком уникальная, например со стега....
Что мешает сделать скрины работающей программы, и слямзить эти самые картинки....
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...