IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Creation d'images png à partir de std::string


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut Creation d'images png à partir de std::string
    Bonjour

    J'utilise la librairie mapnik pour générer des cartes géographiques au format png.

    Pour sauvegarder les cartes il existe une méthode
    void save_to_file(...)
    et une méthode
    string save_to_string(...)

    La gestion derrière est quasiment là même, les 2 appellent une autre méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T1, typename T2>
    void save_as_png(T1 & file , T2 const& image)
    dans le cas du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     std::ofstream file (filename.c_str(), std::ios::out| std::ios::trunc|std::ios::binary);
    if (file)
    {
         save_as_png(file,image);
    et dans le cas du string:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::ostringstream ss(std::ios::out|std::ios::binary);
    //all this should go into image_writer factory
    save_as_png(ss,image);
    ...
    return ss.str();
    jusque là tout va bien mais le code suivant me donne une image illisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    save_to_file<ImageData32>(buf.data(), file, "png");
    std::ofstream fichier("C:\\test.png", std::ios::out | std::ios::trunc);
    if(fichier)
    {
         std::string data = save_to_string<ImageData32>(buf.data(), "png");
         fichier << data;
         fichier.close();
    }
    L'appel "save_to_file" fonctionne très bien mais le fichier rempli par la string récupérée par save_to_string est illisible.
    Je ne sais pas à quoi ça peut être dû.

    L'idée c'est que j'ai besoin de récupérer le string car je dois l'envoyer en réponse d'une requête http.

    Si je compare les tailles des fichiers, il y a une chose étrange:
    le fichier lisible :
    taille : 374.560 octets
    taille sur le disque :376.832 octets
    le fichier illisible
    taille : 376.075 octets
    taille sur le disque :376.832 octets
    Soit exactement la même "taille sur le disque" mais pas la même "taille".
    Je ne sais pas ce quel est la différence entre ces 2 tailles.

    donc voilà je m'en remets à votre savoir

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Ghurdyl Voir le message
    L'idée c'est que j'ai besoin de récupérer le string car je dois l'envoyer en réponse d'une requête http.

    Si je compare les tailles des fichiers, il y a une chose étrange:
    le fichier lisible :
    taille : 374.560 octets
    taille sur le disque :376.832 octets
    le fichier illisible
    taille : 376.075 octets
    taille sur le disque :376.832 octets
    Soit exactement la même "taille sur le disque" mais pas la même "taille".
    Je ne sais pas ce quel est la différence entre ces 2 tailles.

    donc voilà je m'en remets à votre savoir
    Salut,
    1/as-tu regardé s'il y avait des problèmes de type CR/LF ?
    2/As-tu fais une comparaison binaire pour voir où se trouve les différences ?
    3/Si ton string est considéré comme un buffer, alors pourquoi ne pas passer plutôt par un std::vector ?
    4/Si ton string est considéré comme un buffer, alors pourquoi ne pas faire une sauvegarde binaire ?

    P.S. : quel sera l'encodage dans l'envoi de la réponse HTTP ?

  3. #3
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ofstream fichier("C:\\test.png", std::ios::out | std::ios::trunc);
    Dans les autres exemples il y avait le flag std::ios::binary. Pourquoi pas dans celui-ci ?

    D'autre part, si l'API de mapnik fournit une fonction save_to_string, je suppose qu'il doit y avoir aussi une fonction du genre save_to_file(image, const string&) acceptant le genre de string renvoyée par save_to_string, non ?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Pour info,

    La taille du fichier est la taille réelle de celui ci
    La taille sur le disque est la taille prise par le fichier sur le disque dur et comme on peut pas coupé des "cluster" ( ou un truc du genre ) et bah ça prend toujours un peu plus de place...

    Du coup tes fichiers sont bien différent car c'est la taille qui compte, mais comme les fichiers non pas une grandes différences, ils utilisent le même nombre de "cluster"
    Juste que le fichier illisible remplie mieux le dernier "cluster"
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut
    Tout d'abord, merci pour vos réponses

    Citation Envoyé par 3dArchi
    1/as-tu regardé s'il y avait des problèmes de type CR/LF ?
    2/As-tu fais une comparaison binaire pour voir où se trouve les différences ?
    3/Si ton string est considéré comme un buffer, alors pourquoi ne pas passer plutôt par un std::vector ?
    4/Si ton string est considéré comme un buffer, alors pourquoi ne pas faire une sauvegarde binaire ?
    Pour les CR/LF il y a un problème je pense car, même si ce n'est pas un éditeur binaire, les 2 fichiers ouverts dans le bloc-note affichaient un nombre total de lignes différent.(on voit d'ailleurs un passage à la ligne à la 2em ligne qui n'est pas dans le fichier valide)
    Quel outil/méthode puis-je utiliser pour faire une comparaison binaire ?
    Un string considéré comme un buffer, je n'en avais jamais entendu parler
    Et la sauvegarde binaire d'un buffer non plus, comment fait-on ?

    Citation Envoyé par 3dArchi
    P.S. : quel sera l'encodage dans l'envoi de la réponse HTTP ?
    La précédente API (AspMap en Asp.Net) transformait un tableau de byte (généré par l'API) en objet System.dawing.Image (C#) qui lui même était retransformé après (je n'ai pas encore étudié comment) pour être envoyé en réponse http.

    Citation Envoyé par Arzar
    Dans les autres exemples il y avait le flag std::ios::binary. Pourquoi pas dans celui-ci ?

    D'autre part, si l'API de mapnik fournit une fonction save_to_string, je suppose qu'il doit y avoir aussi une fonction du genre save_to_file(image, const string&) acceptant le genre de string renvoyée par save_to_string, non ?
    Pour le std::ios:binary je n'ai pas essayé, pensais que c'était une propriété du fichier et qu'il n'influencerait pas ma std::string. => Si le fichier est mauvais, ça vient de la string. (raisonnement finalement pas très logique)
    Donc par acquis de conscience je vais regarder même si ça ne corrigeras pas mon souci quand je passerai ma string à la partie .Net. (les essais que j'ai déjà effectués se sont révélés infructueux)
    [Edit] Vérification faite, à présent le fichier est lisible quand j'ajoute std::ios::binary [/Edit]
    Quant à une méthode de mapnik prenant en argument un std::string pour écrire dans un fichier il n'y en a pas.

    Et merci pour l'info sur les tailles de fichiers, c'est tout de suite plus clair

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut
    un petit up du topic car je continuer de buter sur la conversion.

    - Ok je peux récupérer mon image sous forme d'un std::string
    - Ok je peux l'écrire dans un fichier à condition de l'ouvrir en mode ios::binary

    mais visiblement il doit y avoir une forme d'altération quand je converti la std::string en System::String^ (mon but n'étant pas de l'écrire sur le disque mais de l'utiliser dans mon application .Net)

    une fois dans C# j'ai trouvé comment convertir un System.String base 64 en un objet System.drawing.Image mais c'est au moment de l'appel de la fonction
    byte[] imageBytes = Convert.FromBase64String(base64String);
    que le programme m'envoie une FormatException en me disant qu'il y a des caractère non valide dans ma chaine base 64.

    je cherche donc à convertir ma chaine en base 64 dans le C++ avant de la convertir en System::String^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Créer une image png à partir d'une image de format quelconque avec Python
    Par bguy4 dans le forum Général Python
    Réponses: 3
    Dernier message: 30/10/2014, 10h49
  2. java/opencv : Création d'une image png à partir de sa chaîne ?
    Par blackbird1 dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 27/02/2014, 20h44
  3. créer une image png à partir d'une fichier XML
    Par med_alpa dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 08/03/2010, 20h53
  4. creation d'une instance à partir d'une string
    Par menuge dans le forum Général Python
    Réponses: 4
    Dernier message: 22/07/2008, 16h24
  5. Alimenter une image byte[] à partir d'un String
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 18
    Dernier message: 31/10/2006, 07h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo