, Как встроить файл в исполняемый файл?

у меня есть маленький демонстрационный исполняемый файл, записал в C++, который зависит только от 5 КБ изображение PNG, загружаемое, прежде чем это сможет работать, который используется для пиксельного текста, который я сделал. Из-за этого файла я должен был бы выделить архив ZIP вместо всего одного исполняемого файла, который создает достаточно трения между загрузкой, и 'играйте' это, я верю, отговорил бы некоторых от испытания его.

Мой вопрос, должен там так или иначе встроить файл PNG (и какой-либо другой файл действительно) в Исполняемый или исходный код так, чтобы это был единственный файл, и исполняемый файл может использовать его?

у меня есть способность проанализировать PNG как поток байтов, таким образом, этому не нужно преобразованный в пиксельные данные.

Заранее спасибо! (Другие вопросы с подобным заголовком к этому существуют, но они и их ответы, кажется, входят в более конкретные вопросы и не были очень полезны)

редактирование : компилятор является Visual C++ 2010, и это находится в Windows (хотя я хотел бы избежать окон определенные утилиты для этого)

edit2: ответ Alf походил на самый портативный метод, таким образом, я быстро записал функцию для парсинга файла PNG в TXT или заголовочный файл, который мог быть считан как неподписанный символ массив. Это, кажется, идентично в этой форме самому файлу PNG, но мой png загрузчик не примет массив. При загрузке его из памяти, синтаксический анализатор PNG берет (пусто * буфер, size_t длина) , если это имеет значение.

код, если вы хотели видеть, но я все еще приму другие ответы, если вы будете думать, что они лучше, чем этот метод:

void compileImagePNGtoBinary(char * filename, char * output){

    FILE * file = fopen(filename, "rb");
    FILE * out = fopen(output, "w");

    unsigned char buffer[32];
    size_t count;
    fprintf(out, "#pragma once \n\n static unsigned char TEXT_PNG_BYTES[] = { ");
    while(!feof(file)){
            count = fread(buffer, 1, 32, file);

            for(int n = 0; n < count; ++n){
                    fprintf(out, "0x%02X, ", buffer[n]);
            };
    };
    fprintf(out, "};");
    fclose(file);
    fclose(out);

};

Заключительное Редактирование : ImageMagick, который также упомянул Alf, сделал точно, в чем я нуждался его, Спасибо!

25
задан Anne Quinn 2 September 2011 в 20:17
поделиться

2 ответа

Посмотрите на XD:

http://www.fourmilab.ch/xd/

Наконец, xd может читать двоичный файл и выдавать объявление данных на языке C, которое содержит данные из файла. Это удобно, когда вы хотите встроить двоичные данные в программы на Си.

Лично я бы использовал ресурсы для окон, но если вам нужен действительно переносимый способ, который не требует знания исполняемого формата, то этот путь. PNG, JPG, что угодно ...

10
ответ дан 28 November 2019 в 21:34
поделиться

На Linux я использую это. Он основан на нескольких примерах, которые я нашел, когда пытался сделать несколько демонстраций 4k, хотя и немного модифицированных. Я считаю, что он может работать и на Windows, но не с встроенной сборкой VS по умолчанию. Мой обходной путь # определение макроса для использования этого кода или системы ресурсов Windows, которую предлагает @MarkRansom (довольно больно работать, но в конце концов работает).

//USAGE: call BINDATA(name, file.txt) and access the char array &name.

#ifndef EMBED_DATA_H
#define EMBED_DATA_H

#ifdef _WIN32
//#error The VS ASM compiler won't work with this, but you can get external ones to do the trick
#define BINDATA #error BINDATA requires nasm
#else

__asm__(
".altmacro\n" \
".macro binfile p q\n" \
"   .global \\p\n" \
"\\p:\n" \
"   .incbin \\q\n" \
"\\p&_end:\n" \
"   .byte 0\n" \
"   .global \\p&_len\n" \
"\\p&_len:\n" \
"   .int(\\p&_end - \\p)\n" \
".endm\n\t"
);

#ifdef __cplusplus
    extern "C" {
#endif

#define BINDATA(n, s) \
__asm__("\n\n.data\n\tbinfile " #n " \"" #s "\"\n"); \
extern char n; \
extern int n##_len;

#ifdef __cplusplus
    }
#endif

#endif

#endif
0
ответ дан 28 November 2019 в 21:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: