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

Delphi Discussion :

Enregistrer une image dans un fichier XML


Sujet :

Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut Enregistrer une image dans un fichier XML
    Bonjour,

    J'aimerais sauvegarder une image de type TBitmap dans un fichier XML qui contient déjà d'autres informations. Quelque chose dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xml>
    <image size="10" top="5" left="5">6432784FFC8783421...</image>
    </xml>
    En cherchant sur le forum, j'ai pensé utiliser un TFileStream, mais ça ne fonctionne pas bien dans ma situation (car je n'ai pas de fichier .bmp en tant que tel).

    Pouvez-vous m'aiguiller ?

  2. #2
    Membre régulier

    Étudiant
    Inscrit en
    Août 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 108
    Points : 124
    Points
    124
    Par défaut
    Bonjour,

    J'ai déja mis une image bmp dans un TStringStream et ca fonctionne bien, peut être que cela répondra à ton problème...

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    Citation Envoyé par NotANumber
    Bonjour,

    J'ai déja mis une image bmp dans un TStringStream et ca fonctionne bien, peut être que cela répondra à ton problème...
    Justement, c'est facile de créer un stream lorsqu'on a un fichier physique .BMP, mais ce n'est pas mon cas: je n'ai qu'un TBitmap.

  4. #4
    Membre régulier

    Étudiant
    Inscrit en
    Août 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 108
    Points : 124
    Points
    124
    Par défaut
    Je me suis mal exprimé désolé.

    J'ai effectivement mis un TBitmap dans un TStringStream sans passer par un fichier.

  5. #5
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    Citation Envoyé par NotANumber
    Je me suis mal exprimé désolé.

    J'ai effectivement mis un TBitmap dans un TStringStream sans passer par un fichier.
    Ah ok. Mais tu peux juste me dire comment tu remplis ton TStringStream ? Il manque un petit "LoadFrom..." dans ce TStringStream

  6. #6
    Membre régulier

    Étudiant
    Inscrit en
    Août 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 108
    Points : 124
    Points
    124
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
      S: TStringStream;
     
    begin
      S := TStringStream.Create('BMP');
      MonBitmap.SaveToStream(S);
      S.Seek(0, soFromBeginning);
      ...
    end;

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Il existe des caractère non utilisable directement dans XML.

    exemple > doit être remplacé par quelque chose comme &...

    Je connais mal Xml, donc je ne connais pas les codes et leur remplaçants.

    TStringStream n'utiliserait il pas de telle caractères ?


    Il est toujour posibke de convertir l'image en base 64. Il existe des composant sur le net. voir aussi dlmine qui est plus complet.

    Désolé, je ne peux pas vous donner le code que nous utilisont en interne. mon patron ne serait tres content.

  8. #8
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    Merci pour vos réponses. On m'a aussi conseillé d'utiliser le format MIME pour enregistrer l'image dans un fichier XML.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Mime Fais la convertion base64 avec une decoupe par bloque (72 ou 80 caractères ?) séparé par un CR et ajoute un header et un signale de fin.

    C'est donc un peux plus long que le base 64 de base. C'est le format qui est utilisé dans les E-Mail.

    J'ai de la chance, le gollègue à coté de moi peut m'expliquer les différence.

  10. #10
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    Citation Envoyé par Tardiff Jean-François
    Mime Fais la convertion base64 avec une decoupe par bloque (72 ou 80 caractères ?) séparé par un CR et ajoute un header et un signale de fin.

    C'est donc un peux plus long que le base 64 de base. C'est le format qui est utilisé dans les E-Mail.

    J'ai de la chance, le gollègue à coté de moi peut m'expliquer les différence.
    Intéressant. Mais je dois avouer que je ne saisis pas exactement ce que tu entends par "conversion base64". Tu penses que ça vaut vraiment la peine que je creuse cette méthode, ou est-ce que le MIME me suffit ? Quelle est la réelle différence au niveau des performances ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    En faisant bref.

    Dans un octet il est possible de mettre une valeur de 0 à 255.
    Certain des caractères correspondant ne sont pas possible à mettre dans un fichier txt (ne serais ce que les caractère de contrôle de type CR et LF)

    La conversion en base 64 prend 2 octets et les traduit en 3 octets dont tous les caractères sont compatibles en mode txt.

    La traduction en MIME est basé sur des convertion du même type dont le base 64 (je ne connait pas les autres, mais le header MIME indique les convertion. Il doit donc y avoir d'autre).
    MIME est un peux plus grand, mais il est standard (utilisé pour les courriel) et contient quelques informations en plus dans le header.

    Ne connaisant pas bien le sujet, je ne peux pas précisser. Par contre vous pouvez vous envoyer un courriel avec une image et regarder le résultat.

    En tous cas, MIME en fait plus qu'il ne vous faut, sans être trop lourd. Si vous avez de quoi convertir votre fichier au format MIME ne chercher pas plus loint. du moins a mon avis.

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 67
    Points : 102
    Points
    102
    Par défaut
    bonjour,
    Je reviens sur la question bitmap -> xml qui peut se réduire à bitmat -> string
    On se sert ensuite de cette string dans une structure xml.


    Dans l'aide delphi, il y a un exemple pour convertir un objet de type TComponent en string :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    function Component2String(Component: TComponent): string;
    var
       BinStream:TMemoryStream;
       StrStream: TStringStream;
       s: string;
    begin
            try
               BinStream := TMemoryStream.Create;
               StrStream := TStringStream.Create(s);
               BinStream.WriteComponent(Component);
               BinStream.Seek(0, soFromBeginning);
               ObjectBinaryToText(BinStream, StrStream);
               StrStream.Seek(0, soFromBeginning);
               Result:= StrStream.DataString;
            finally
                   StrStream.Free;
                   BinStream.Free
            end;
    end;
     
    function String2Component(Value: string): TComponent;
    var
       StrStream:TStringStream;
       BinStream: TMemoryStream;
    begin
         Result    := nil;
         try
            StrStream := TStringStream.Create(Value);
            BinStream := TMemoryStream.Create;
            ObjectTextToBinary(StrStream, BinStream);
            BinStream.Seek(0, soFromBeginning);
            Result := BinStream.ReadComponent(nil);
         finally
                BinStream.Free;
                StrStream.Free;
         end;
    end;
    Evidemment, comme TBitmap n'est pas un décendant de TComponent, ça marche pas pour un bitmap. Mais si on construit un nouvel objet dérivé de TComponent et qui possède quelque propriété d'un bitmap ...

    Comme c'est un peu long j'ai mis ça dans un zip avec un projet exemple

    Il me semble que c'est une bonne idéé de départ mais si tu pouvais précisé ce que tu veux faire du xml ça aiderait un peu

    a+
    Fichiers attachés Fichiers attachés
    "Ce n'est pas parce que les choses sont difficiles qu'elles nous font peur, c'est parce qu'elles nous font peur qu'elle sont difficiles"

  13. #13
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    Merci pour ton aide Nihao, mais j'ai réussi à faire fonctionner la conversion en base64 avec le composant TIdEncoderMIME qui marche très bien avec les bitmap. J'arrive à sauver un objet TBitmap dans mon XML et à le recharger.

    Mon problème actuellement est de faire la même chose avec un objet TGraphic pour les fichiers JPEG, GIF, etc. J'obtiens là une erreur "Uneven size in encode", mais je vais ouvrir un nouveau sujet à ce propos pour des raisons de clarté:

    http://www.developpez.net/forums/sho...d.php?t=153089

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

Discussions similaires

  1. enregistrer une image dans un fichier sous FTP
    Par briza dans le forum Langage
    Réponses: 6
    Dernier message: 07/05/2014, 18h50
  2. [Débutant] Referencement d'une image dans un fichier xml
    Par Andrian dans le forum C#
    Réponses: 5
    Dernier message: 14/01/2013, 16h23
  3. extraire source d'une image dans un fichier XML
    Par zied87 dans le forum Windows Phone
    Réponses: 5
    Dernier message: 17/08/2011, 12h29
  4. Enregistrer une image dans un fichier texte
    Par rvdth dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/05/2009, 14h02
  5. [C# 2.0] Comment sauver une image dans un fichier Xml ?
    Par Louis-Guillaume Morand dans le forum C#
    Réponses: 4
    Dernier message: 08/09/2006, 18h47

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