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
Vous devez vous connecter pour publier un commentaire.
Un portable est de définir une fonction comme
Puis tout ce que vous avez à faire est d'écrire un petit programme d'aide programme qui lit le fichier PNG en tant que binaire et génère le C++ accolades initialiseur de texte. Modifier: @awoodland a souligné dans son commentaire à la question, que ImageMagick a une petite aide...
Bien sûr, pour Windows-programme spécifique, au lieu d'utiliser l'ordinaire de ressources de Windows régime.
Cheers & hth.,
Regarder XD:
http://www.fourmilab.ch/xd/
Personnellement, je préfère utiliser les ressources de windows, mais si vous avez besoin d'un véritable portable manière qui n'implique pas la connaissance du format de fichier exécutable, c'est le chemin à parcourir. PNG, JPG, etc...
C'est exécutable au format dépendants, ce qui signifie intrinsèquement système d'exploitation/compilateur dépendante. Windows offre le système de Ressources pour ce comme mentionné dans cette question.
Base64 encoder le fichier et le mettre dans une chaîne de caractères quelque part dans votre code 😉
Vous pouvez intégrer n'importe quel fichier dans votre programme de ressources: (MSDN) Ressources Définis par l'Utilisateur.
Une fois que vous avez fait cela, vous pouvez utiliser le Fonction LoadResource d'accès les octets contenus dans le fichier.
Sur linux, je l'utilise. Il est basé sur quelques exemples que j'ai trouvés lors de la tentative de faire quelques démos 4k, quoique un peu modifié. Je crois qu'il peut fonctionner sur windows aussi, mais pas avec la valeur par défaut VS assembly en ligne. Ma solution est #définition d'une macro pour utiliser ce code ou les fenêtres de ressources système que @MarkRansom suggère (très douloureux de se mettre au travail, mais ne les travaux par la suite).