у меня есть маленький демонстрационный исполняемый файл, записал в 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, сделал точно, в чем я нуждался его, Спасибо!
Посмотрите на XD:
Наконец, xd может читать двоичный файл и выдавать объявление данных на языке C, которое содержит данные из файла. Это удобно, когда вы хотите встроить двоичные данные в программы на Си.
Лично я бы использовал ресурсы для окон, но если вам нужен действительно переносимый способ, который не требует знания исполняемого формата, то этот путь. PNG, JPG, что угодно ...
На 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