Partage
  • Partager sur Facebook
  • Partager sur Twitter

Créer une image bitmap avec un fichier .txt

[Question]

    29 août 2018 à 2:15:04

    Bonjour,

    Cela va faire pas mal de temps déjà que je cherche sur l'internet comment faire une image bitmap à partir de texte.

    J'essaie de faire un programme en c++, dans lequel, il me faudrait créer une image, à partir de texte. J'ai pour l'instant essayé de mettre un fichier .bmp en un fichier .txt, pour voir à quoi cela ressemblait, pour pouvoir le reproduire. Une fois le .bmp en .txt, je peux refaire passer le .txt en .bmp, après l'avoir modifier, sans aucun problème. Par contre, si à partir de mon programme, je créer un fichier .bmp, et que j'écrit la MÊME chose que j'avais trouver dans le .txt d'avant, et que j'essaie d'ouvrir le .bmp généré : ça ne fonctionne pas. Le fichier n'a pas l'air d'être prit en compte comme une image, je n'ai pas réussi à l'ouvrir.

    Même sans passer par mon programme, si je créer un .txt, et que je met tous ce qu'il faut pour faire un .bmp, et que je convertis en .bmp, ça ne fonctionne pas.

    Je ne suis pas forcément très doué pour tout cela, pas encore. pour convertir, j'utilise la console (Windows) avec la commande : ren [NomFichier].bmp [NomFichierConvertis].txt ( Et inversement ).

    J'espère que vous pourrez m'aider.

    Je ne savais pas trop où poser cette question, j'espère que je ne l'ai pas mit au mauvaise endroit.

    -
    Edité par Jean-Lucien 29 août 2018 à 2:17:08

    • Partager sur Facebook
    • Partager sur Twitter
      29 août 2018 à 10:16:40

      Salut,

      Mauvaise idée de passer par le format texte pour le BMP : c'est directement du binaire !

      Voici un exemple :

      http://fvirtman.free.fr/recueil/01_09_02_testbmp.c.php


      Et pour ton problème, il est simplement possible que ce soit du au fichier texte, il faut ouvrir tes fichiers (lecture ou écriture) avec "wb"/"rb" si tu utilises fopen (au lieu de "w","r") ou bien ios::binary si tu utilises fstream ou ostream, sinon pour le fihcier texte, des octets seront rajoutés dans un cas précis (\n)

      -
      Edité par Fvirtman 29 août 2018 à 10:21:58

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        29 août 2018 à 12:35:20

        Merci pour ta réponse, je test cela dès que possible !

        EDIT :

        Re bonjour,

        Merci de ta réponse, bien qu'un peu compliqué pour moi, je ne suis que débutant.

        J'ai essayé de mettre ios::binary, mais cela ne change pas le fait que je n'arrive pas à ouvrir l'image. Quand au code que vous m'avez envoyé, je n'ai pas tout bien compris, je suis débutant. Cela ne m'aura pas vraiment aidé, mais je vous remercie tout de même.

        -
        Edité par Jean-Lucien 29 août 2018 à 19:03:11

        • Partager sur Facebook
        • Partager sur Twitter
          30 août 2018 à 13:33:08

          Bonjour,

          Je reformule ma demande, afin qu'elle soit plus claire.

          Alors voilà, je désire faire un programme en C++, permettant de créer des images aléatoire. J'ai cherché un type de fichier où tout les pixels était écrit. J'ai trouvé le .bmp, je me suis donc dit, " Si je change la valeur des pixels par une valeur créer aléatoirement, j'aurai une image totalement aléatoire". Le problème est que, je suis vraiment un débutant en C++, je n'ai donc que de petites bases. Alors j'ai procéder de la sorte :

          -D'abord, je me suis dit qu'il fallait créer un fichier .bmp vide.

          string const imgBMP("C:/Users/Jean_Lucien/Desktop/expérience/bmpIMG.bmp");
          ofstream BMPImg(imgBMP.c_str(), ios::binary);

          Façon simple qui permet d'écrire dans un fichier. ( Le ios::binary me vient Fvirtman )

          -Une fois le fichier créer, et que je pouvais écrire dedans, je me suis dit que si je mettait très exactement la même chose dans un fichier .bmp, tout aller marcher. J'ai donc fait :

          BMPImg << "424d 7601 0000 0000 0000 3600 0000 2800" << endl;
          BMPImg << "0000 0a00 0000 0a00 0000 0100 1800 0000" << endl;
          BMPImg << "0000 4001 0000 c30e 0000 c30e 0000 0000" << endl;
          BMPImg << "0000 0000 0000 ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff ffff ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff 0000 ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff ffff ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff 0000 ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff ffff ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff 0000 ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff ffff ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff 0000 ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ff80 00ff 8000 ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff 0000 ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ff80 00ff 8000 ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff 0000 ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff ffff ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff 0000 ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff ffff ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff 0000 ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff ffff ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff 0000 ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff ffff ffff ffff ffff ffff ffff" << endl;
          BMPImg << "ffff ffff 0000" << endl;

          Histoire de tester, je n'ai pas modifier la valeur des pixels, avec une autre aléatoire.

          Le problème, c'est que ça ne fonctionne pas. Peut-être que j'ai fait une erreur évidente pour certain, si oui, dites la moi. Comme je l'ai dit je suis débutant en C++.

          J'espère que vous pourrez m'aider.

          • Partager sur Facebook
          • Partager sur Twitter
            30 août 2018 à 16:32:55

            Là, vous n'entrez pas du binaire mais des chaines de caractères ASCII.

            Votre "f" de "ffff ..." ne vaut pas le demi-octet (ou les 4 bits) '1111' mais l'octet correspondant au code ASCII de "f" : 102 (http://www.asciitable.com/) qui en binaire vaut '1100110'.

            Il faut que vous révisiez un peu les représentations mémoires.

            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              30 août 2018 à 17:37:13

              Merci de votre réponse,

              J'ai bien compris que je ne faisais pas de la bonne manière. Le problème étant que, je n'ai toujours pas de solution à mon problème. Me dire que je suis dans l'erreur est bien aimable, mais je le sais déjà, sinon je ne viendrai pas demandé d'aide. 

              De plus, je suis VRAIMENT débutant, de plus amples explications seraient la bienvenue. Que me conseillez-vous donc de faire ?

              Mais merci d'avoir prit votre temps pour tenter de m'aider. Malheureusement pour moi, je ne connais pas trop ce qu'est la représentation mémoire. ( Je ne suis vraiment pas très doué, désolé )

              -
              Edité par Jean-Lucien 30 août 2018 à 17:37:29

              • Partager sur Facebook
              • Partager sur Twitter
                31 août 2018 à 2:08:42

                Ca ne marche pas comme ça, un fichier texte, c'est du texte, une image c'est autre chose, la plupart du temps c'est un fichier binaire dont l'encodage respecte un certain format gif,jpg,bmp, png... Pour passer du texte à une image c'est "relativement simple" (du moins pas impossiblement compliqué), il suffit de dessiner le texte, c'est assez abominable à programmer mais si on est très motivé, ça ne présente pas beaucoup de difficulté. Si on  ne veut pas se faire chier, on se trouve un logiciel de traitement d'image qui gère bien les captures d'écran (genre Paint .Net) et le tour est joué. Dans l'autre sens, c'est plus compliqué, car il va falloir reconnaître du texte dans un dessin, et là sans un OCR, c'est la misère. 

                • Partager sur Facebook
                • Partager sur Twitter
                Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                  31 août 2018 à 2:32:33

                  Merci de votre réponse,

                  mais je crois que vous n'avez pas tout à fait compris ma requête.

                  Je veux écrire pixel par pixel avec un système d'aléatoire, pour avoir des images aléatoire. Je ne veux pas que mon texte devienne une image, ni même détecter du texte dans une image. Enfin, merci quand même d'avoir prit un peu de votre temps pour mon problème. C'est le geste qui compte disons.

                  J'espère encore peut-être que vous puissiez m'aider.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    31 août 2018 à 10:10:48

                    Jean-Lucien a écrit:

                    Merci de votre réponse,

                    mais je crois que vous n'avez pas tout à fait compris ma requête.

                    Je veux écrire pixel par pixel avec un système d'aléatoire, pour avoir des images aléatoire. Je ne veux pas que mon texte devienne une image, ni même détecter du texte dans une image. Enfin, merci quand même d'avoir prit un peu de votre temps pour mon problème. C'est le geste qui compte disons.

                    J'espère encore peut-être que vous puissiez m'aider.


                    Salut,

                    Non, il y a malentendu, personne n'a parlé de texte qui devient une image (de police de caractère par exemple), on parle d'encodage du texte dans le BMP.

                    Quand tu écris "ff ff" dans ton cout, en réalité, tu injectes 5 octets. Si tu t'en réfères à la table ASCII :

                    http://www.asciitable.com/

                    En vrai tu injectes 66 66 32 66 66  

                    car 66 est le code ASCII de "ff" et 32 celui de l'espace que tu mets.

                    Non, il faut réallement mettre "ff", n'utilise pas cout, utilise ofstream::write

                    Voir l'exemple à la fin

                    http://www.cplusplus.com/reference/ostream/ostream/write/


                    -
                    Edité par Fvirtman 31 août 2018 à 10:18:37

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                      31 août 2018 à 10:35:17

                      Tu as des tas de bibliothèques qui permettent de manipuler une image pixel par pixel, en fait, tous les famework GUI (Qt, wxWidget ...) le font, et toutes les bibliothèques graphiques le font aussi.

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                        31 août 2018 à 12:56:54

                        Bonjour et merci,

                        En effet, il y avait mal entendu, je comprend mieux maintenant. Et en effet, cela écrivait des "66 66 32 66 66". Je crois que vous avez résolu mon problème !

                        Merci, je test ça, et j'edit ce message si jamais ça ne fonctionne pas.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 septembre 2018 à 0:22:28

                          Bonjour, 

                          J'ai finalement testé de faire cela avec ofstream::write. Malheureusement, ça ne marche toujours pas. Peut-être que je m'y suis mal prit, mais l'image n'est toujours pas reconnu comme une image .bmp, je n'arrive toujours pas à l'ouvrir. Les choses écrites dans le fichier ne correspondent pas avec ce que j'ai demandé au programme de mettre.

                          J'ai donc pensé à une autre solution, celle de créer au préalable une image .bmp, puis de modifier le contenue de ce fichier. J'ai d'abord testé de faire ça manuellement, cela marcher. Le problème est que, pour pouvoir faire cela avec mon programme je devais d'abord supprimer tout ce qu'il y avait dans le fichier, mais sans le supprimer, cela reviendrai à le recréer par dessus, donc aucune utilité d'en avoir créé un au préalable. Je n'ai pas trouvé de solution pour vider un fichier sans le supprimer.

                          Alors j'ai vu que si j'écrivais au début du fichier, au dessus de ce qui est déjà écrit dans celui-ci ( l'ancien image ), les lignes que je veux ( ma nouvelle image ),  cela n'allait que prendre les premières lignes ( ma nouvelle image, donc ). Mais je ne sais pas si cela est conseillé.

                          J'espère avoir été clair, et j'espère que vous pourrez m'aider.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 septembre 2018 à 10:40:17

                            Dans mon exemple donné tout au début, même si tu ne comprends pas les fonctions, le main montre comment les utiliser.... Et ça marche. C'est C, pas du C++, mais l'utilisation est la même.... 

                            Avec ce que tu viens de dire, tu n'échapperas pas au write non plus.

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                              2 septembre 2018 à 12:01:56

                              Merci,

                              Dans ce cas, je vais reregarder plus attentivement votre code.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Créer une image bitmap avec un fichier .txt

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown