У меня есть небольшой демонстрационный исполняемый файл, написанный на С++, который зависит только от одного загружаемого PNG-изображения размером 5 килобайт до его запуска, который используется для текста пикселя, который я сделал. Из-за этого одного файла мне нужно будет выдать ZIP-архив, а не только один исполняемый файл, что создает достаточное трение между загрузкой и "игрой", которые, как я считаю, будут отговаривать некоторых из них.
Мой вопрос в том, есть ли в любом случае встроить PNG файл (и любой другой файл) в исполняемый или исходный код, чтобы он был единственным файлом, и исполняемый файл может его использовать?
У меня есть возможность анализировать PNG как поток байтов, поэтому он не нуждается в преобразовании в данные пикселя.
Спасибо заранее! (Другие вопросы с похожим названием для этого существуют, но они и их ответы, похоже, затрагивают более конкретные проблемы и не очень помогают)
edit. Компилятор - это Visual С++ 2010, и это работает в Windows (хотя я бы хотел, чтобы для этого были использованы специальные утилиты для Windows)
edit2: ответ Alf казался самым переносимым методом, поэтому я быстро написал функцию для синтаксического анализа PNG файла в TXT или заголовочный файл, который можно было бы читать как массив unsigned char
. Кажется, что он идентичен в этом виде самому файлу PNG, но мой загрузчик png не принимает массив. При загрузке из памяти парсер PNG принимает (void * buffer, size_t length)
, если это имеет значение.
Код, если вы хотите его увидеть, но я по-прежнему буду принимать другие ответы, если вы думаете, что они лучше этого метода:
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);
};
Final Edit: ImageMagick, о котором Alf также упомянул, именно то, что мне нужно, спасибо!