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

Обсуждение вопросов, связанных с обработкой аудио и видео информации

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

Postby Boris_K on 16 Oct 2018, 14:56

В проекте используется своя графика, выводимая программно в Picture indicator. Есть исходные ресурсы - png-картинки, загружаемые при старте программы (нужно работать из .exe). Нужно защитить и скрыть эти картинки - сшить в один файл ресурсов. Проблема в том, как потом загружать png прямо из памяти - ведь Read PNG file принимает только путь к файлу, поэтому в программе пришлось бы вываливать готовые png на диск, считывать и тут же удалять. Как бы отлично работает, но ясно что вариант это черезж..пный. Можно ли как-то загрузить png прямо из памяти, то есть с массива?
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
 
Posts: 281
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby Borjomy_1 on 16 Oct 2018, 15:01

Храните константами типа Image data.
Borjomy_1
expert
expert
 
Posts: 1896
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 329
VIP

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

Postby dadreamer on 16 Oct 2018, 15:03

Boris_K wrote:Можно ли как-то загрузить png прямо из памяти, то есть с массива?

Можно: https://forums.ni.com/t5/Machine-Vision ... 705#M51129
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

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

Postby Boris_K on 16 Oct 2018, 16:05

dadreamer, спасибо за вариант.
Borjomy_1, то есть просто скопировать кластер Image data в константу на БД? Но тогда графика будет храниться прямо в exe и в несжатом виде, и второе явно плохо.
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
 
Posts: 281
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby dadreamer on 16 Oct 2018, 16:12

Boris_K wrote:dadreamer, спасибо за вариант. Вроде не должно быть проблем с работоспособностью на разных машинах?

Я проблем не встречал, использовал на W7, 8.1 и 10 (32/64 бита ОСь и LV). На Vista и XP тоже должно работать, начиная с SP3.
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

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

Postby Kosist on 16 Oct 2018, 22:03

Boris_K wrote:В проекте используется своя графика, выводимая программно в 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 позволяют это легко сделать)...
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 961
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 270
CLAD I/O VIP students

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

Postby dadreamer on 17 Oct 2018, 11:57

Kosist wrote:А Вы пробовали при создании exe, указывать Destination картинок прямо в exe файл? Тогда просто так с файловой системы их не открыть, они будут внутри exе. Вроде бы можно такое провернуть...

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

А это крайне хорошая идея, т.к. практически всегда на любую защиту находится дырка для её обхода. Если кто-то захочет вытянуть картинки из вашей проги, он это сделает (при наличии прямых рук и мозгов). Можно только усложнить хакеру задачу. Для этого картинки стоит зашифровать чем-то наподобие Blowfish, AES или аналогичным криптоалгоритмом. После этого картинки можно достать, либо подобрав криптографический ключ (что займет многие годы на современном железе), либо детально разобравшись в структуре данных внутри экзешника (что потребует серьёзных знаний реверс-инжиниринга). Можно, конечно, картинку вытащить тупо из памяти, когда она будет отображена на панели - ну, тут уж никакая защита не спасёт. :D
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

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

Postby Blackman on 17 Oct 2018, 12:10

Что же так сложно все :) :wink:
PNG Data to LV Image VI
http://zone.ni.com/reference/en-XX/help ... _pngtoimg/
Blackman
leader
leader
 
Posts: 880
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 259
VIP

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

Postby dadreamer on 17 Oct 2018, 12:48

Blackman wrote:Что же так сложно все :) :wink:

Зато универсально :wink: А если автор захочет изменить формат изображений на JPEG или BMP? В :labview: ведь нет функции BMP/JPEG To LV Image (есть только идея на Idea Exchange).
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

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

Postby Boris_K on 17 Oct 2018, 13:29

dadreamer wrote:Как именно это сделать? Я попробовал, но после билда картинка помещается в папку data, а не вовнутрь экзешника. Что сделал: добавил картинку в проект, на вкладке Source Files поместил её в Always Included. На вкладке Source File Settings не даёт указать .exe в качестве Destination. На форумах NI вроде тоже пишут, что в папку data только можно помещать.

Попробовал, аналогично.
Blackman, спасибо! :super: Во куда они запихали этот :vi: ! Я конечно понимаю что Web-сервисы и "Portable network graphics" немного связаны. Немного. Но могли же они добавить этот :vi: и в палитры работы с графикой. :crazy:
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
 
Posts: 281
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby Kosist on 17 Oct 2018, 14:33

dadreamer wrote:Как именно это сделать? Я попробовал, но после билда картинка помещается в папку data, а не вовнутрь экзешника. Что сделал: добавил картинку в проект, на вкладке Source Files поместил её в Always Included. На вкладке Source File Settings не даёт указать .exe в качестве Destination. На форумах NI вроде тоже пишут, что в папку data только можно помещать.

Простите, дурака :crazy: - хотя и писал, что "вроде бы это можно", но не был до конца уверен... Даже создание Build Destination вручную (с путем к екзе) не помогает.
Хотя, если поиграться - то можно обхитрить LabVIEW, вопрос лишь нужно ли это... На форуме уже ведь обсуждали, как "открыть" екзешник; и что при билде LabVIEW создает вначале архив, а затем как-то его перепаковывает в екзе. Может можно "на лету" во время билда "впихнуть" картинку внутрь архива? Но, скорее всего, компайлер заметит "махинации", и не закончит билд успешно...
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 961
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 270
CLAD I/O VIP students

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

Postby dadreamer on 17 Oct 2018, 14:53

Kosist wrote:Может можно "на лету" во время билда "впихнуть" картинку внутрь архива? Но, скорее всего, компайлер заметит "махинации", и не закончит билд успешно...

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

Теоретически есть возможность хранить что угодно внутри :vi: в виде ресурса или в тэгах :vi: . Естественно, работа с ними должна осуществляться только из-под :labview: , т.к. другие приложения просто не смогут разобрать формат данных.
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

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

Postby Boris_K on 17 Oct 2018, 15:28

Попробовал хранить данные картинки прямо на БД в виде строковой константы - всё ок, размер :vi: увеличивается только на размер png-файла. Но стоит ту константу хоть как-то заюзать - даже просто подключить к ней индикатор - и размер :vi: разбухает в 2 раза. Видимо создаётся копия данных и зачем-то сохраняется в файле :vi: . Но с exe всё нормально. Тем не менее, с чем может быть связано, можно ли как-то вылечить?
Race conditions - опасный и скользкий баг!
Boris_K
developer
developer
 
Posts: 281
Joined: 28 Jan 2015, 14:25
LabVIEW Version: 2012 Pro
Karma: 6

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

Postby dadreamer on 17 Oct 2018, 15:45

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

Вряд ли это реально вылечить. Если константа не подключена на БД, то она фигурирует только в графе диаграммы, т.е. в скомпилированном коде её нет (галочки "Disconnect ..." в свойствах билда это обеспечивают). Если константу подключили, то она участвует в коде и при компиляции тоже попадает в "выхлоп" компилятора, потому и сохраняется в двух ресурсах. Это мои предположения, могу где-то и ошибиться.
Boris_K wrote:Но с 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: в менеджер изображений.
User avatar
dadreamer
professor
professor
 
Posts: 3303
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 844
I/O VIP vision internet

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

Postby IvanLis on 17 Oct 2018, 17:27

Я не понимаю, из чего проблема?
Либо картинка слишком уникальная, например со стега....
Что мешает сделать скрины работающей программы, и слямзить эти самые картинки....
User avatar
IvanLis
professor
professor
 
Posts: 4815
Joined: 02 Dec 2009, 17:44
Location: СССР
Medals: 7
Activity (2) Professionalism (1) Tutorials (1) Gold (1) Man of the year 2012 (1)
Автор (1)
LabVIEW Version: 2015, 2016
Karma: 763
hardware VIP bloggers teachers

Next

Return to Работа с графикой и звуком

Who is online

Users browsing this forum: No registered users and 2 guests

cron