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 :

Remplir un TImage avec différents TPicture


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut Remplir un TImage avec différents TPicture
    Bonjour,
    J'ai un Array de TPicture, avec une taille assez grande (disons W=200 x H=300).
    Je voudrais remplir un TImage, avec les images des TPicture, en les mettant cote à cote.
    La hauteur du TImage est plus petite (H=60).
    Pour la mise à l'échelle, Image.Stretch:=true et Image.Proportional := true
    me permettent de loader un Picture correctement....

    Mais pour mettre plusieurs Pictures cote à cote, je vois pas trop.

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with Image.Picture.Bitmap.Canvas do
                   Draw(x, 0, Picture[i].Bitmap);
    avec un x qui se met à jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x := x + (Picture[1].Width*Image.Height) div Picture[i].Height;
    Mais ça merdouille....le draw ne doit pas se faire avec proportionnalité, ou un truc du genre.

    Quelqu'un a-t-il été confronté au pb ?

    Il faudrait sans doute mettre tous mes Picture à l'échelle avant Draw ?



    Merci pour votre aide.

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    hou là....

    Je te convie à faire un petit tour sur le forum avec comme mots clefs pour la recherche TImage et TBitmap.

    En fait, le problême c'est que (tu n'es pas le seul je te rassure) tu considères que les propriétés de ton TImage (Stretch) affectent le dessin du TBitmap qu'il contient alors que ça n'a rien à voir.

    Vois plutôt la chose comme ça
    - TBitmap est l'image en elle même, codée avec ses pixels et qui est invisible (si, si) tant qu'on ne l'a pas affiché d'une manière ou d'une autre. Cette image à ses propres dimensions et tu peux effectivement agir dessus.

    TImage, est une fenêtre (un contrôle fenétré si tu préfères), qui sait afficher des Tbitmap (si on en a chargé un ou créé un dedans) de diverses façons : transparent, centré, étiré, etc... Les dimensions du TImage correspondent aux dimensions de ce qui est affiché sur la fiche et leurs modification ne change en rien les dimensions du Bitmap qu'il affiche.

    Donc quand tu "recopie" tes TPicture dans ton TImage, c'est en fait dans le TBitmap qu'il y a dessous que tu le fais.

    Du coup, ce ne sont pas les dimensions de Image qu'il faut prendre en compte, mais les dimensions de Image.picture.bitmap.

    En plus, StretchDraw, c'est mieux que Draw...

    Du coup :
    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
    var i,x,largeur,hauteur:integer;
        Pictures:array[1..n] of TPicture;
        Arect:Trect;
    begin
      x:=0;
      hauteur:=Image.Picture.Bitmap.Height;
      for i:=1 to n do
      begin
        largeur:=(Picture[i].Width*hauteur) div Picture[i].Height;
        Arect:=Bounds(x,0,largeur,hauteur)
        with Image.Picture.Bitmap.Canvas do
             Draw(x, 0, Picture[i].Bitmap);
        x := x +largeur;
      end;
    end;
    Et puis tu avais mis Pictures[1] au lieu de Pictures[i]...

    ça devrait être drôlement plus beau avec ça
    Bidouilleuse Delphi

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut
    Merci pour tes éléments.

    Ton Trect doit servir avec le StretchDraw, sans doute ?

    J'essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StretchDraw(aRect, Picture[i].Bitmap);
    mais je ne vois pas mon Picture[i] s'afficher.

    Et avec ton code, pareil.

    L'image en fond de TImage, mise par défaut, disparait, et c'est tout.
    Y aurait-il une propriété de TImage à mettre à true ?
    ou du Image.Picture ?
    ou du Image.Picture.Bitmap ?
    ou du Image.Picture.Bitmap.Canvas ?

    Pas simple, tout ça.
    Je pencherais pour une propriété du Canvas, vu ce que tu m'as dit...

    Si je voulais superposer 2 Pictures au même endroit du TImage, et que l'on voit les 2 Picture par transparence, y a-t-il une propriété à gérer quelque part ?
    J'ai fait un truc comme ça, il y a des années, mais impossible de me remémorer le bazar ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Canvas.CopyMode := cmMergeCopy;
    ??

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par delphidebutant
    Merci pour tes éléments.

    Ton Trect doit servir avec le StretchDraw, sans doute ?

    J'essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StretchDraw(aRect, Picture[i].Bitmap);
    Oui, oui, c'est ça... j'avais oublié
    Citation Envoyé par delphidebutant
    mais je ne vois pas mon Picture[i] s'afficher.

    Et avec ton code, pareil.
    Ha ?
    Je vois, ça me fait la même chose...
    Citation Envoyé par delphidebutant
    L'image en fond de TImage, mise par défaut, disparait, et c'est tout.
    Y aurait-il une propriété de TImage à mettre à true ?
    ou du Image.Picture ?
    ou du Image.Picture.Bitmap ?
    ou du Image.Picture.Bitmap.Canvas ?

    Pas simple, tout ça.
    Je pencherais pour une propriété du Canvas, vu ce que tu m'as dit...

    Si je voulais superposer 2 Pictures au même endroit du TImage, et que l'on voit les 2 Picture par transparence, y a-t-il une propriété à gérer quelque part ?
    J'ai fait un truc comme ça, il y a des années, mais impossible de me remémorer le bazar ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Canvas.CopyMode := cmMergeCopy;
    ??
    Pour la transparence je fait ca avec Bitblt en général (API Windows), tu devrais trouver du code "Made in waskol" sur le forum...


    Pour le reste :

    Bon allez, là j'ai testé
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var i,x,largeur,hauteur:integer;
        Pictures:array[1..3] of TPicture;
        Arect:Trect;
    begin
      //Ca, c'est histoire de mettre quelque chose dans le tableau...
      pictures[1]:=Image1.Picture;
      pictures[2]:=Image2.Picture;
      pictures[3]:=Image3.Picture;
     
      //Ca, c'est ce qui t'intéresse
     
      //1) On dimensionne le Bitmap du TImage
      Image.Picture.Bitmap.Height:=Image.Height;
      Image.Picture.Bitmap.Width:=Image.Width;
      x:=0;
      hauteur:=Image.Picture.Bitmap.Height;
      for i:=1 to 3 do
      begin
        largeur:=(Pictures[i].Width*hauteur) div Pictures[i].Height;
        Arect:=Bounds(x,0,largeur,hauteur);
        with Image1.Canvas do
             StretchDraw(Arect, Pictures[i].Graphic);
        x := x +largeur;
      end;
      image.Refresh;
      pictures[1]:=nil;
      pictures[2]:=nil;
      pictures[3]:=nil;
    end;
    Ca va te plaire...
    Bidouilleuse Delphi

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Pour la transparence, c'est ici :
    http://www.developpez.net/forums/sho...ghlight=bitblt
    Bidouilleuse Delphi

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut
    J'ai encore eu quelques soucis avec ton code.
    Je mettais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StretchDraw(Arect, Pictures[i].bitmap);
    au lieu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StretchDraw(Arect, Pictures[i].Graphic);
    ce qui met les Pictures[i].bitmap.Height et Width à zéro...

    Mais maintenant, ça marche.

    Donc, Big Merci.

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

Discussions similaires

  1. Remplir un tableau avec 2 tables différentes
    Par cyrux dans le forum Langage
    Réponses: 15
    Dernier message: 30/07/2010, 09h37
  2. Remplir 3 champs textes différents avec une liste déroulante
    Par azorol dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/12/2005, 00h04
  3. remplir une table avec UTL_FILE.GET_LINE
    Par delphim dans le forum SQL
    Réponses: 9
    Dernier message: 12/03/2004, 10h15
  4. [version] Requete Update avec différentes versions de mySQL
    Par regbegpower dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/01/2004, 17h19
  5. [TChart] comment remplir un histogramme avec du rouge strié.
    Par :GREG: dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2002, 09h37

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