Загрузить png из памяти

Обсуждение вопросов, связанных с обработкой аудио и видео информации
Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Репутация: 0
Версия LabVIEW: 2012 Pro

Загрузить png из памяти

Сообщение Boris_K »

В проекте используется своя графика, выводимая программно в Picture indicator. Есть исходные ресурсы - png-картинки, загружаемые при старте программы (нужно работать из .exe). Нужно защитить и скрыть эти картинки - сшить в один файл ресурсов. Проблема в том, как потом загружать png прямо из памяти - ведь Read PNG file принимает только путь к файлу, поэтому в программе пришлось бы вываливать готовые png на диск, считывать и тут же удалять. Как бы отлично работает, но ясно что вариант это черезж..пный. Можно ли как-то загрузить png прямо из памяти, то есть с массива?
Race conditions - опасный и скользкий баг!

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1911
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Репутация: 0
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов

Re: Загрузить png из памяти

Сообщение Borjomy_1 »

Храните константами типа Image data.

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3477
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2019
Контактная информация:

Re: Загрузить png из памяти

Сообщение dadreamer »

Boris_K писал(а):Можно ли как-то загрузить png прямо из памяти, то есть с массива?
Можно: https://forums.ni.com/t5/Machine-Vision ... 705#M51129

Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Репутация: 0
Версия LabVIEW: 2012 Pro

Re: Загрузить png из памяти

Сообщение Boris_K »

dadreamer, спасибо за вариант.
Borjomy_1, то есть просто скопировать кластер Image data в константу на БД? Но тогда графика будет храниться прямо в exe и в несжатом виде, и второе явно плохо.
Race conditions - опасный и скользкий баг!

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3477
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2019
Контактная информация:

Re: Загрузить png из памяти

Сообщение dadreamer »

Boris_K писал(а):dadreamer, спасибо за вариант. Вроде не должно быть проблем с работоспособностью на разных машинах?
Я проблем не встречал, использовал на W7, 8.1 и 10 (32/64 бита ОСь и LV). На Vista и XP тоже должно работать, начиная с SP3.

Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1067
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Репутация: 0
Версия LabVIEW: 2013-2017
Контактная информация:

Re: Загрузить png из памяти

Сообщение Kosist »

Boris_K писал(а):В проекте используется своя графика, выводимая программно в Picture indicator. Есть исходные ресурсы - png-картинки, загружаемые при старте программы (нужно работать из .exe). Нужно защитить и скрыть эти картинки - сшить в один файл ресурсов.
А Вы пробовали при создании exe, указывать Destination картинок прямо в exe файл? Тогда просто так с файловой системы их не открыть, они будут внутри exе. Вроде бы можно такое провернуть... А в самой программе использовать Conditional Disable Structure, и при Run-Time Engine = False читать их с диска (при разработке и тестировании), а при Run-Time Engine = True читать их по пути типа ...SomeApplicationName.exe\data\Picture.png, и т.д.
Для пущей безопасности, сами файлы можете "закодировать", или сжать в архив (функции от OpenG Toolkit позволяют это легко сделать)...
Мы делили апельсин - много наших полегло...

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3477
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2019
Контактная информация:

Re: Загрузить png из памяти

Сообщение dadreamer »

Kosist писал(а):А Вы пробовали при создании exe, указывать Destination картинок прямо в exe файл? Тогда просто так с файловой системы их не открыть, они будут внутри exе. Вроде бы можно такое провернуть...
Как именно это сделать? Я попробовал, но после билда картинка помещается в папку data, а не вовнутрь экзешника. Что сделал: добавил картинку в проект, на вкладке Source Files поместил её в Always Included. На вкладке Source File Settings не даёт указать .exe в качестве Destination. На форумах NI вроде тоже пишут, что в папку data только можно помещать.
Kosist писал(а):Для пущей безопасности, сами файлы можете "закодировать", или сжать в архив (функции от OpenG Toolkit позволяют это легко сделать)...
А это крайне хорошая идея, т.к. практически всегда на любую защиту находится дырка для её обхода. Если кто-то захочет вытянуть картинки из вашей проги, он это сделает (при наличии прямых рук и мозгов). Можно только усложнить хакеру задачу. Для этого картинки стоит зашифровать чем-то наподобие Blowfish, AES или аналогичным криптоалгоритмом. После этого картинки можно достать, либо подобрав криптографический ключ (что займет многие годы на современном железе), либо детально разобравшись в структуре данных внутри экзешника (что потребует серьёзных знаний реверс-инжиниринга). Можно, конечно, картинку вытащить тупо из памяти, когда она будет отображена на панели - ну, тут уж никакая защита не спасёт. :D

Blackman

Activity
leader
leader
Сообщения: 917
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Репутация: 0
Версия LabVIEW: 6.1,8.5,20
Контактная информация:

Re: Загрузить png из памяти

Сообщение Blackman »

Что же так сложно все :) :wink:
PNG Data to LV Image VI
http://zone.ni.com/reference/en-XX/help ... _pngtoimg/

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3477
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2019
Контактная информация:

Re: Загрузить png из памяти

Сообщение dadreamer »

Blackman писал(а):Что же так сложно все :) :wink:
Зато универсально :wink: А если автор захочет изменить формат изображений на JPEG или BMP? В :labview: ведь нет функции BMP/JPEG To LV Image (есть только идея на Idea Exchange).

Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Репутация: 0
Версия LabVIEW: 2012 Pro

Re: Загрузить png из памяти

Сообщение Boris_K »

dadreamer писал(а):Как именно это сделать? Я попробовал, но после билда картинка помещается в папку data, а не вовнутрь экзешника. Что сделал: добавил картинку в проект, на вкладке Source Files поместил её в Always Included. На вкладке Source File Settings не даёт указать .exe в качестве Destination. На форумах NI вроде тоже пишут, что в папку data только можно помещать.
Попробовал, аналогично.
Blackman, спасибо! :super: Во куда они запихали этот :vi: ! Я конечно понимаю что Web-сервисы и "Portable network graphics" немного связаны. Немного. Но могли же они добавить этот :vi: и в палитры работы с графикой. :crazy:
Race conditions - опасный и скользкий баг!

Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1067
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Репутация: 0
Версия LabVIEW: 2013-2017
Контактная информация:

Re: Загрузить png из памяти

Сообщение Kosist »

dadreamer писал(а):Как именно это сделать? Я попробовал, но после билда картинка помещается в папку data, а не вовнутрь экзешника. Что сделал: добавил картинку в проект, на вкладке Source Files поместил её в Always Included. На вкладке Source File Settings не даёт указать .exe в качестве Destination. На форумах NI вроде тоже пишут, что в папку data только можно помещать.
Простите, дурака :crazy: - хотя и писал, что "вроде бы это можно", но не был до конца уверен... Даже создание Build Destination вручную (с путем к екзе) не помогает.
Хотя, если поиграться - то можно обхитрить LabVIEW, вопрос лишь нужно ли это... На форуме уже ведь обсуждали, как "открыть" екзешник; и что при билде LabVIEW создает вначале архив, а затем как-то его перепаковывает в екзе. Может можно "на лету" во время билда "впихнуть" картинку внутрь архива? Но, скорее всего, компайлер заметит "махинации", и не закончит билд успешно...
Мы делили апельсин - много наших полегло...

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3477
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2019
Контактная информация:

Re: Загрузить png из памяти

Сообщение dadreamer »

Kosist писал(а):Может можно "на лету" во время билда "впихнуть" картинку внутрь архива? Но, скорее всего, компайлер заметит "махинации", и не закончит билд успешно...
Это уже из области фантастики. Потребуется переписать :vi: для билдинга, что не самая простая затея. Или написать перепаковщик готовых .exe, но это тоже тот ещё гемор, т.к. llb в зашифрованном виде хранится (хотя я дешифратор как-то писал уже, но для FFF он непригоден).

Теоретически есть возможность хранить что угодно внутри :vi: в виде ресурса или в тэгах :vi: . Естественно, работа с ними должна осуществляться только из-под :labview: , т.к. другие приложения просто не смогут разобрать формат данных.

Boris_K
developer
developer
Сообщения: 281
Зарегистрирован: 28 янв 2015, 14:25
Репутация: 0
Версия LabVIEW: 2012 Pro

Re: Загрузить png из памяти

Сообщение Boris_K »

Попробовал хранить данные картинки прямо на БД в виде строковой константы - всё ок, размер :vi: увеличивается только на размер png-файла. Но стоит ту константу хоть как-то заюзать - даже просто подключить к ней индикатор - и размер :vi: разбухает в 2 раза. Видимо создаётся копия данных и зачем-то сохраняется в файле :vi: . Но с exe всё нормально. Тем не менее, с чем может быть связано, можно ли как-то вылечить?
Race conditions - опасный и скользкий баг!

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3477
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Репутация: 0
Версия LabVIEW: 2.5 — 2019
Контактная информация:

Re: Загрузить png из памяти

Сообщение dadreamer »

Boris_K писал(а):Попробовал хранить данные картинки прямо на БД в виде строковой константы - всё ок, размер :vi: увеличивается только на размер png-файла. Но стоит ту константу хоть как-то заюзать - даже просто подключить к ней индикатор - и размер :vi: разбухает в 2 раза. Видимо создаётся копия данных и зачем-то сохраняется в файле :vi: . Можно ли как-то вылечить? С exe пока не пробовал, но подозреваю что будет так же.
Вряд ли это реально вылечить. Если константа не подключена на БД, то она фигурирует только в графе диаграммы, т.е. в скомпилированном коде её нет (галочки "Disconnect ..." в свойствах билда это обеспечивают). Если константу подключили, то она участвует в коде и при компиляции тоже попадает в "выхлоп" компилятора, потому и сохраняется в двух ресурсах. Это мои предположения, могу где-то и ошибиться.
Boris_K писал(а):Но с exe всё нормально.
В .exe диаграмм у :vi: нет, так что константа сохраняется только в скомпилированном коде.

Попробуйте VI Tags, см. пример от Blackman по ссылке выше. Для использования тэгов вам понадобится пара вспомогательных самодельных :vi: : Write Image(s) to VI и Read Image(s) from VI (условно).
Алгоритм примерно такой:
Write Image(s) to VI:
1. Открывается целевой :vi: ;
2. В тэг с некоторым уникальным именем пишется изображение (предварительно загруженное из файла) в бинарном виде;
3. :vi: сохраняется;
4. :vi: закрывается.
Read Image(s) from VI:
1. Открывается целевой :vi: ;
2. Из тэга с некоторым уникальным именем читается изображение в бинарном виде, если нужно, отображается на индикаторе/пишется в стандартный файл;
3. :vi: закрывается
Конечно, придётся вставить эти два :vi: в проект и таскать их вместе с основным :vi: . Можно, при желании, совместить оба :vi: в менеджер изображений.

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
professor
professor
Сообщения: 4921
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Репутация: 0
Версия LabVIEW: 2015, 2016
Откуда: СССР

Re: Загрузить png из памяти

Сообщение IvanLis »

Я не понимаю, из чего проблема?
Либо картинка слишком уникальная, например со стега....
Что мешает сделать скрины работающей программы, и слямзить эти самые картинки....

Ответить

Вернуться в «Работа с графикой и звуком»