Comment intégrer un fichier dans un exécutable?

J'ai une petite démo exécutable écrit en C++, qui ne dépend que de l'un de 5 ko image PNG en cours de chargement avant de pouvoir s'exécuter, qui est utilisé pour un pixel de texte que j'ai fait. En raison de ce seul fichier, j'aurais besoin de donner une archive ZIP au lieu d'un seul fichier exécutable, ce qui crée assez de friction entre les télécharger et de "jouer" qui, je crois, serait de dissuader certains de l'essayer.

Ma question est, est-il de toute façon à incorporer le fichier PNG (et tout autre fichier) dans l'Exécutable ou du code source, de sorte que c'est un seul fichier, et le fichier exécutable peut l'utiliser?

J'ai la possibilité d'analyser le PNG comme un flux d'octets, de sorte qu'il n'a pas besoin de converti de données de pixels.

Merci d'avance! (D'autres questions avec un titre similaire à cela, mais ils et leurs réponses semblent entrer dans des questions plus spécifiques et n'étaient pas très utile)

modifier:Le compilateur Visual C++ 2010 et c'est sur Windows (bien que je voudrais éviter de windows utilitaires spécifiques pour cela)

edit2: Alf réponse semblait être la méthode la plus portable, donc j'ai rapidement écrit une fonction pour analyser le fichier PNG dans un TXT ou fichier d'en-tête qui pourrait être lu comme un unsigned char tableau. Il semble être identique dans le présent formulaire à l'PNG fichier lui-même, mais mon png chargeur de ne pas accepter les tableau. Lors du chargement de la mémoire, à l'PNG analyseur prend un (void * buffer, size_t length) si il le faut.

Le code si vous voulais voir, mais je vais tout de même accepter d'autres réponses si vous pensez qu'ils sont mieux que cette méthode:

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);

};

Montage Final: ImageMagick qui Fal également mentionné a fait exactement ce dont j'avais besoin, merci!

source d'informationauteur Anne Quinn | 2011-09-02