Как встроить данные в приложение

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

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

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

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


person Brad    schedule 15.08.2010    source источник


Ответы (4)


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

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

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

Подробнее о формате XPM см. здесь. Разумеется, легко найти конвертеры в XPM из других популярных форматов.

person Alex Martelli    schedule 15.08.2010
comment
@Brad, я полагаю, только прозрачность как параметр включения / выключения - а не полная, нюансированная прозрачность, предлагаемая настоящими альфа-каналами. - person Alex Martelli; 16.08.2010

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

eg:

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

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

person doron    schedule 15.08.2010

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

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

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

person Lothar    schedule 16.08.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);

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

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

person ezpresso    schedule 03.11.2010