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 :

Charger une image à partir d'une chaine HEXA


Sujet :

Delphi

  1. #1
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 207
    Points : 133
    Points
    133
    Par défaut Charger une image à partir d'une chaine HEXA
    Bonjour,

    J'aimerai faire un truc un peu spécial.
    J'aimerai généré une TImage à partir d'une chaine de caractère qui serait en fait une suite de nombre Héxadécimal représentant un bitmap.

    En fait je prend un projet (VCL/Forms) tout bête j'ajoute un composant TImage puis depuis la propriété Picture j'ouvre une image BMP. Ensuite je vais dans le DFM et la je trouve mon image sous la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      object Image1: TImage
        Left = 32
        Top = 216
        Width = 73
        Height = 73
        Picture.Data = {      07544269746D6170A6020000424DA60200000000000036000000280000001000      00000D0000000100180000000000700200000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000     0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000      0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000}
    J'aimerais simplement reprendre la partie située dans "Picture.Data", la mettre dans un .pas p.ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      Image   : AnsiString;
    begin
        Image :=
          '07544269746D6170A6020000424DA60200000000000036000000280000001000' +      '00000D0000000100180000000000700200000000000000000000000000000000' +   '0000000000000000000000000000000000000000000000000000000000000000' +   '0000000000000000000000000000000000000000000000000000000000000000' +    '0000000000000000000000000000000000000000000000000000000000000000' +
     '0000000000000000000000000000000000000000000000000000000000000000' +   '0000000000000000000000000000000000000000000000000000000000000000' +      '0000000000000000000000000000000000000000000000000000000000000000' 
    +      '0000000000000000000000000000000000000000000000000000000000000000' +     '0000000000000000000000000000000000000000000000000000000000000000' +   '0000000000000000000000000000000000000000000000000000000000000000' +    '0000000000000000000000000000000000000000000000000000000000000000' +    '0000000000000000000000000000000000000000000000000000000000000000' +
     '0000000000000000000000000000000000000000000000000000000000000000' +     '0000000000000000000000000000000000000000000000000000000000000000' +      '0000000000000000000000000000000000000000000000000000000000000000' +     '0000000000000000000000000000000000000000000000000000000000000000' +     '0000000000000000000000000000000000000000000000000000000000000000' +      '0000000000000000000000000000000000000000000000000000000000000000' +      '0000000000000000000000000000000000000000000000000000000000000000' +    '0000000000000000000000000000000000000000000000000000000000000000' +'000000000000000000000000000000000000';
    Et hop pas un procédé miraculeux que vous aller me décrire je vais pouvoir la charger dans un TImage.

    Vous avez une idée ??
    @@++

  2. #2
    Membre confirmé

    Homme Profil pro
    Chef de Projet ATIC
    Inscrit en
    Novembre 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Chef de Projet ATIC
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 274
    Points : 508
    Points
    508
    Par défaut
    Il me semble que l'on voit dans les dfm le représentation hexa de l'image, comme s'il s'agissait d'un fichier.

    Il faut donc charger l'image via les fonctions LoadFromxxxx (file, stream ou clipboard) des composants TImage.

    Soit tu crées un fichier texte, tu y colles tes données, tu fais un LoadFromfile du fichier puis effaces le fichier,

    Soit tu crées un TSTream, tu y envoies les données et tu recharges avec un LoadFromStream,

    Ou enfin, tu copies les données dans le presse papiers et les récupère via un LoadFromClipboard.

    Personnellement, j'utilise la méthode SaveToStream et LoadFromStream pour sauvegarder et recharger des icones, bmp et png choisis par l'utilisateur dans une base de données.

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    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
    function StringToComponent(const AString: String; AComp: TComponent): TComponent;
    var
      InputStream: TStringStream;
      OutputStream: TMemoryStream;
    begin
      InputStream := TStringStream.Create(AString);
      OutputStream := TMemoryStream.Create;
      try
        { Turn string into component }
        ObjectTextToBinary(InputStream, OutputStream);
        { Go back to start of output stream }
        OutputStream.Seek(0, soFromBeginning);
        { Read component from stream, creating one if one is not passed in }
        Result := OutputStream.ReadComponent(AComp)
      finally
        InputStream.Free;
        OutputStream.Free
      end
    end;

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 207
    Points : 133
    Points
    133
    Par défaut
    Bonsoir !!

    Déja merci de vos réponse.


    anapurna :

    T'as technique ma parait pas mal. Cependant lorsque je la mets en application j'ai l'erreur suivant (Type EParseError) elle est produite par la fonction ObjectTextToBinary :

    OBJECT Excepted on line 1

    As-tu une idée sur le pourquoi du comment ??

    Okaryn :
    Pour ce qui est de ta solution c'est en effet ce que je pensais faire. Cependant le soucis est que lorsque j'utilise ma grosse chaine de caracètre et que je la met dans un StringField et que je le load dans un TImage (.Picture.Bitmap.LoadFromStream), il me dit comme quoi mon fichier n'est pas du bon type. Normal vu que le problème et que le Stream va transformer ma chaine de caractère en héxa au lieu de me la mettre directement en tant qu'image héxa. Vous voyez ce que je veux dire ??

    En fait faudrait que ma chaîne de caracètre soit prise tel quel en mémoire sans typage.

    En tout cas merci de me filer un coup de main.
    @@++

  5. #5
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 207
    Points : 133
    Points
    133
    Par défaut
    Yeah !! J'ai compris !!!

    En fait la fonction StringToComponent fonctionne tout à fait bien. Mais j'avais pas compris que fallait mettre vraiment toute la partie relative au composant du DFM dans la String!! Du coup je met vraiment tout le TImage complet dans ma chaine de caracètre et on est content, fait beau les mouches pètes !!

    Top Cool.

    Je vais implémenter tout ça !! Merci beaucoup pour votre aide....

    PS au modérateur : Je termine le poste quand je suis süre que tout marche.
    @@++

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/03/2013, 14h14
  2. Charger une image à partir d'une collection d'images
    Par toutounesan dans le forum VB.NET
    Réponses: 34
    Dernier message: 15/06/2011, 11h16
  3. Saisir une image à partir d'une photo ou d'une vidéo
    Par lohengrin56 dans le forum Flash/Flex
    Réponses: 0
    Dernier message: 07/07/2009, 16h17
  4. Réponses: 7
    Dernier message: 07/07/2008, 11h18
  5. afficher une image à partir d'une base de données access
    Par zidenne dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/11/2005, 11h41

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