Как встраивать данные в приложение - PullRequest
3 голосов
/ 16 августа 2010

Я хочу сделать приложение, но приложение будет использовать значки (растровые изображения) для некоторых кнопок меню и других вещей. Я хочу сохранить свое приложение в виде одного простого отдельного exe-файла, что означает, что мне каким-то образом придется встраивать все значки в приложение (EXE на окнах), чтобы я мог загружать растровые изображения без внешних файлов.

Кто-нибудь знает, как я могу это сделать?

Просто другая информация: Я использую wxWidgets, в настоящее время с MSVC, и я бы предпочел метод, который работает кросс-компилятор / кросс-платформенный, если это возможно.

Заранее спасибо!

Ответы [ 4 ]

6 голосов
/ 16 августа 2010

Вы можете использовать формат XPM для своих растровых изображений, так как его легко встроить в код (который, конечно, будет в exe, именно там, где вы хотите ;-).Как говорят документы ,

Все платформы wxWidgets поддерживают XPM для небольших растровых изображений и значков.Вы можете включить встроенный XPM, как показано ниже, поскольку это код C, или вы можете загрузить его во время выполнения

(«как показано ниже», являющееся директивой #include) - так что выбыло бы идеально кросс-компилятор и кроссплатформенный, приняв этот подход с опцией «включить».

Для получения дополнительной информации о формате XPM см. здесь .Конечно, легко найти конвертеры в XPM из других популярных форматов.

1 голос
/ 16 августа 2010

Windows имеет файлы ресурсов. Вы можете использовать это.В качестве альтернативы вы можете написать небольшую утилиту, которая преобразует ваш двоичный значок в массив констант C

, например:

const unsigned int my_icon[] = {0x12345678, 0x87654321, .... };

Это можно легко сделать в Perl, и вы можете получить к нему доступ спеременная my_icon.

0 голосов
/ 03 ноября 2010

Мы используем эту технику в наших проектах:

  1. Используйте optipng ./image.png для оптимизации вашего png-файла.
  2. Преобразование данных двоичного изображения в текст с использованием png2wx Perl-скрипта.
  3. Вставьте изображение в исходный код следующим образом:
    
    {
        wxMemoryInputStream sm("\211PNG\r\n\032\n\000\000....", 116);
        m_bitmap = wxBitmap( wxImage(sm) );
    }

Не забудьте добавить поддержку формата PNG в вашу функцию wxApp::OnInit():

wxImage::AddHandler(new wxPNGHandler);

Здесь - ссылка на оригинальный учебник.

Надеюсь, это поможет!

0 голосов
/ 17 августа 2010

Причина У Linux нет платформенного решения, для этого вам все равно придется создавать собственную систему.Поэтому я бы рекомендовал не использовать специфичные для платформы способы добавления ресурсов в windows и macosx.

Вы можете использовать переупаковку, которая поставляется с FOX GUI Toolkit - простой инструмент для преобразования любого двоичного файла в cсимвольные литералы.Если вы скомпилируете с msvc, вы скоро обнаружите, что большие файлы с большим количеством больших строк являются ядом для компилятора.Я добавил около 900 иконок для своего проекта, и это убило компилятор.

В настоящее время я работаю с решением, в котором я просто копирую двоичный архив в конце исполняемого файла.Сегодня каждая платформа может предоставить вам путь к исполняемому файлу, и ни ELF, ни EXE, ни файлы Mach-O не заботятся о добавлении дополнительных данных в конце исполняемого файла.

...