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 :

affichage de Timage


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Points : 5
    Points
    5
    Par défaut affichage de Timage
    bonjour,
    je'essaie de créer une application qui utilise des contrôles Timage sur lesquels je mets des bitmaps;
    J'ai 2 questions pour lesquelles je n'ai pas trouve de solution.
    1- est-il-possible d'afficher les contrôles Timage avec une inclinaison (pas verticaux);
    2- quand je superpose partiellement 2 Timages le contrôle créé en premier est toujours en arriére plan. est-il-possible de le mettre en premier plan?

    merci de votre réponse.

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Salut

    1- est-il-possible d'afficher les contrôles Timage avec une inclinaison (pas verticaux);
    Non, pas de moyen direct à ma connaissance.

    2- quand je superpose partiellement 2 Timages le contrôle créé en premier est toujours en arriére plan. est-il-possible de le mettre en premier plan?
    Essaie avec la méthode BringToFront.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Points : 5
    Points
    5
    Par défaut ok
    merci e-ric, je vais essayer
    dommage que l'on ne peux pas incliner les images, il manque une propriété inclinaison.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par bbchess Voir le message
    merci e-ric, je vais essayer
    dommage que l'on ne peux pas incliner les images, il manque une propriété inclinaison.
    tout dépend de la version de Delphi , en FMX (donc XE+) il me semble que c'est possible
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    dommage que l'on ne peux pas incliner les images, il manque une propriété inclinaison.
    Oui, c'est dommage.
    Mais dans un Timage on peut quand-même y placer un BitMap dont le tracé est lui-même incliné ... mais ça oblige à compliquer un peu le code.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-salut,

    Tiens voici un bout de code qui renvoie un BitMap incliné :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    type
      TRGBArray = array[0..0] of TRGBTriple;   // élément de bitmap (API windows)
      pRGBArray = ^TRGBArray;                  // type pointeur vers tableau 3 octets 24 bits
     
    var ScanLinesS : array[Word] of pRGBArray; // BmpSource : Tableau de lignes
        ScanLinesD : array[Word] of PRGBArray; // BmpDestination
     
    function BmpRotation(bmpS : tBitMap; ADeg : integer; AAA : boolean) : tBitMap;
    //       Rotation de bmpSource vers BmpDestination avec angle de ADeg en degrés
    //       Formules de la rotation de centre xc, yc et d'angle a :
    //        x2 = xc + (x1-xc) * cos(a) - (y1-yc) * sin(a)
    //        y2 = yc + (x1-xc) * sin(a) + (y1-yc) * cos(a)
    var      dx, dy :   single;       // pour les calculs en réels
             xS, yS :  integer;       // pixel source
             xD, yD :  integer;       // pixel destination
             xc, yc :  integer;       // Centre de rotation
             wyx, wyy : integer;
             dxc,dyc : integer;       // Décalages entre centre de rotation de Bmp-Result et centre du Bmp-Source
             i : integer;
             R, G, B : integer;       // Pour moyenne Anti-Alias de couleurs de 4 points
    begin
             while ADeg > 360 do ADeg := ADeg - 360;  // ramener angle dans [0..360]
             while ADeg < 0   do ADeg := 360 + ADeg;
     
             // Bmp Result :
             Result:=tBitMap.Create;
             with Result do begin
                   PixelFormat:=pf24bit;
                   Width:=Round(sqrt(sqr(bmpS.Width)+sqr(bmpS.Height))); // = diagonale du BmpSource
                   Height:=Width; // Bmp carré
                   xc := width shr 1; yc := height shr 1; // centre de la rotation
             end;
             dxc:=(Result.Width -bmpS.Width)  div 2;  // décalage entre centre du Bmp Carré et bmSource
             dyc:=(Result.Height-bmpS.Height) div 2;
     
             for i := 0 to BmpS.height-1   do ScanLinesS[i]:= BmpS.scanline[i];   // Source
             for i := 0 to Result.height-1 do ScanLinesD[i]:= Result.scanline[i]; // Destination
     
             for yD := 0 to Result.height-1 do begin
                 dy := yD - yc;                  // distance y au centre
                 wyx := round(dy*Sinus[ADeg]);
                 wyy := round(dy*Cosin[ADeg]);
                 for xD := 0 to Result.width-1 do begin
                   dx := xD - xc;                // distance x au centre
                   xS := xc + round(dx * Cosin[ADeg]) - wyx - dxc;
                   yS := yc + round(dx * Sinus[ADeg]) + wyy - dyc;
     
                   if (xS>=0) and (yS>=0) and (xS<bmpS.width-1) and (yS<BmpS.height-1) then begin
                    R := ScanLinesS[yS, xS].rgbtred;
                    G := ScanLinesS[yS, xS].rgbtgreen;
                    B := ScanLinesS[yS, xS].rgbtblue;
                    if AAA and (xS+1 < bmpS.width-1) and (yS+1 < bmpS.height-1) then begin // adoucissement Anti-Alias
                          R := (R   + ScanLinesS[yS,  xS+1].Rgbtred
                                    + ScanLinesS[yS+1,xS  ].Rgbtred
                                    + ScanLinesS[yS+1,xS+1].Rgbtred) div 4;
                          G := (G   + ScanLinesS[yS  ,xS+1].Rgbtgreen
                                    + ScanLinesS[yS+1,xS  ].Rgbtgreen
                                    + ScanLinesS[yS+1,xS+1].rgbtgreen) div 4;
                          B := (B   + ScanLinesS[yS  ,xS+1].Rgbtblue
                                    + ScanLinesS[yS+1,xS  ].Rgbtblue
                                    + ScanLinesS[yS+1,xS+1].rgbtblue) div 4;
                    end; //if (xS+1 ...
                    ScanLinesD[yD,xD].Rgbtred   :=  R;
                    ScanLinesD[yD,xD].Rgbtgreen :=  G;
                    ScanLinesD[yD,xD].Rgbtblue  :=  B;
                  end //if (xS>=0) ...
                  else begin // Couleur de remplissage pas de correspondance en entrée
                             ScanLinesD[yD,xD].Rgbtred   :=  255;
                             ScanLinesD[yD,xD].Rgbtgreen :=  255;
                             ScanLinesD[yD,xD].Rgbtblue  :=  255;
                       end;
                end; // for xD
              end; // for yD
    end;
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Points : 5
    Points
    5
    Par défaut oui pour l'inclinaidon du bitmap
    je pense que le code permer d'incliner un bitmap mais pas le composant Timage qui le contient. une partie du bitmap sort de l'épure et donc le résultat n'est pas le résultat souhaité.
    merci qd même

  8. #8
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Hi

    Adapte la taille de ton objet TImage après le calcul.

    Si tu veux conserver les dimensions de ton Image orignale, travailles sur un Bitmap en mémoire et copie-la avec la méthode StretchDraw de Canvas au prix d'une petite déformation de l'image

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Citation Envoyé par Bbchess
    je pense que le code permet d'incliner un bitmap mais pas le composant Timage qui le contient
    Je n'ai jamais dit que le code permet d'incliner le TImage mais le BitMap qu'on y place et si on bascule la propriété Transparent du TImage à True on ne s'aperçoit pas que le TImage est vertical.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-Bonjour,

    Pendant qu'on y est : voici le code complété car j'avais oublié que la function BmpRotation :
    - utilise des Sinus et Cosinus pré-calculés,
    - et d'y déclarer en fin de code Result.TransparentColor:=clWhite (le blanc est utilisé dans le bitmap-Résult pour les zones dépassant l'image d'origine.

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    type
      TRGBArray = array[0..0] of TRGBTriple;   // élément de bitmap (API windows)
      pRGBArray = ^TRGBArray;                  // type pointeur vers tableau 3 octets 24 bits
    
    var ScanLinesS : array[Word] of pRGBArray; // BmpSource : Tableau de lignes
        ScanLinesD : array[Word] of PRGBArray; // BmpDestination
    
    var Sinus: array[0..360] of Double; // Sinus et Cosinus précalculés
      Cosin: array[0..360] of Double;
    
    procedure PreCalculSinCos;
    var i: integer; a: Double;
    begin for i := 0 to 360 do begin
        a := i;
        Sinus[i] := sin((pi * a) / 180);
        Cosin[i] := cos((pi * a) / 180);
      end;
    end;
    
    function BmpRotation(bmpS : tBitMap; ADeg : integer; AAA : boolean) : tBitMap;
    //       Rotation de bmpSource vers BmpDestination avec angle de ADeg en degrés
    //       Formules de la rotation de centre xc, yc et d'angle a :
    //        x2 = xc + (x1-xc) * cos(a) - (y1-yc) * sin(a)
    //        y2 = yc + (x1-xc) * sin(a) + (y1-yc) * cos(a)
    var      dx, dy :   single;       // pour les calculs en réels
             xS, yS :  integer;       // pixel source
             xD, yD :  integer;       // pixel destination
             xc, yc :  integer;       // Centre de rotation
             wyx, wyy : integer;
             dxc,dyc : integer;       // Décalages entre centre de rotation de Bmp-Result et centre du Bmp-Source
             i : integer;
             R, G, B : integer;       // Pour moyenne Anti-Alias de couleurs de 4 points
    begin
             while ADeg > 360 do ADeg := ADeg - 360;  // ramener angle dans [0..360]
             while ADeg < 0   do ADeg := 360 + ADeg;
    
             // Bmp Result :
             Result:=tBitMap.Create;
             with Result do begin
                   PixelFormat:=pf24bit;
                   Width:=Round(sqrt(sqr(bmpS.Width)+sqr(bmpS.Height))); // = diagonale du BmpSource
                   Height:=Width; // Bmp carré
                   xc := width shr 1; yc := height shr 1; // centre de la rotation
             end;
             dxc:=(Result.Width -bmpS.Width)  div 2;  // décalage entre centre du Bmp Carré et bmSource
             dyc:=(Result.Height-bmpS.Height) div 2;
    
             for i := 0 to BmpS.height-1   do ScanLinesS[i]:= BmpS.scanline[i];   // Source
             for i := 0 to Result.height-1 do ScanLinesD[i]:= Result.scanline[i]; // Destination
     
             for yD := 0 to Result.height-1 do begin
                 dy := yD - yc;                  // distance y au centre
                 wyx := round(dy*Sinus[ADeg]);
                 wyy := round(dy*Cosin[ADeg]);
                 for xD := 0 to Result.width-1 do begin
                   dx := xD - xc;                // distance x au centre
                   xS := xc + round(dx * Cosin[ADeg]) - wyx - dxc;
                   yS := yc + round(dx * Sinus[ADeg]) + wyy - dyc;
    
                   if (xS>=0) and (yS>=0) and (xS<bmpS.width-1) and (yS<BmpS.height-1) then begin
                    R := ScanLinesS[yS, xS].rgbtred;
                    G := ScanLinesS[yS, xS].rgbtgreen;
                    B := ScanLinesS[yS, xS].rgbtblue;
                    if AAA and (xS+1 < bmpS.width-1) and (yS+1 < bmpS.height-1) then begin // adoucissement Anti-Alias
                          R := (R   + ScanLinesS[yS,  xS+1].Rgbtred
                                    + ScanLinesS[yS+1,xS  ].Rgbtred
                                    + ScanLinesS[yS+1,xS+1].Rgbtred) div 4;
                          G := (G   + ScanLinesS[yS  ,xS+1].Rgbtgreen
                                    + ScanLinesS[yS+1,xS  ].Rgbtgreen
                                    + ScanLinesS[yS+1,xS+1].rgbtgreen) div 4;
                          B := (B   + ScanLinesS[yS  ,xS+1].Rgbtblue
                                    + ScanLinesS[yS+1,xS  ].Rgbtblue
                                    + ScanLinesS[yS+1,xS+1].rgbtblue) div 4;
                    end; //if (xS+1 ...
                    ScanLinesD[yD,xD].Rgbtred   :=  R;
                    ScanLinesD[yD,xD].Rgbtgreen :=  G;
                    ScanLinesD[yD,xD].Rgbtblue  :=  B;
                  end //if (xS>=0) ...
                  else begin // Couleur de remplissage pas de correspondance en entrée
                             ScanLinesD[yD,xD].Rgbtred   :=  255;
                             ScanLinesD[yD,xD].Rgbtgreen :=  255;
                             ScanLinesD[yD,xD].Rgbtblue  :=  255;
                       end;
                end; // for xD
              end; // for yD
        Result.TransparentColor:=clWhite; // Ligne ajoutée
    end;
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.btnInclinerClick(Sender: TObject);
    var Bmi : tBitMap;
    begin
      PreCalculSinCos;
       Bmi:=BmpRotation(image1.Picture.Bitmap, 45,TRUE);
       image2.Transparent:=true;
       image2.AutoSize:=true;
       image2.Picture.Bitmap.Assign(Bmi);
       Bmi.Free;
    end;
    A propos de
    "une partie du bitmap sort de l'épure et donc le résultat n'est pas le résultat souhaité".
    Avec image2.AutoSize:=true ce problème est réglé.

    A+.
    Images attachées Images attachées  
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

Discussions similaires

  1. Copier une portion de l'affichage d'un composant vers un TImage
    Par bubulemaster dans le forum Débuter
    Réponses: 4
    Dernier message: 31/01/2008, 12h16
  2. Forcer l'affichage d'un TImage au-dessus
    Par OutOfRange dans le forum Delphi
    Réponses: 6
    Dernier message: 07/01/2007, 11h26
  3. Affichage de plusieurs images dans dans un Timage
    Par Petzouille57 dans le forum Delphi
    Réponses: 1
    Dernier message: 19/10/2006, 16h16
  4. [débutant] affichage de Timage
    Par Anthony17 dans le forum Delphi
    Réponses: 2
    Dernier message: 24/05/2006, 12h09
  5. Pb affichage du canvas dans une TImage
    Par Tango dans le forum Composants VCL
    Réponses: 28
    Dernier message: 11/10/2005, 13h57

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