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 :

Comment agrandir bitmap ListView


Sujet :

Delphi

  1. #1
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut Comment agrandir bitmap ListView
    Bonjour
    Apres plusieurs tentation avec Tlistview pour agrandir une bitmap , je n’arrive pas a être satisfait , et pour cela je m’adresse a vous pour trouver une aide
    Bon voila mon code
    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
     
    procedure FillListView(path: string; mask: string = '*.jpg');
    var
      sr:  TSearchRec;
      img: TPicture;
      bmp: TBitmap;
      pic: TBitMap;
    begin
      img := TPicture.Create;
      bmp := TBitMap.Create;
      pic := TBitMap.Create;
      With Form1 do
      if FindFirst(path + mask, $20, sr) = 0 then
      begin
        repeat
          if (sr.Attr and $20) = $20 then
          begin
            try
              img.LoadFromFile(path + sr.Name);
            except
              Continue;
            end;
            bmp.Assign(img.Graphic);
            pic.Width := 80;
            pic.Height:= 80;
            pic.Canvas.StretchDraw(Rect(0,0,pic.Width, pic.Height), bmp);
            ImageList1.Add(pic, nil);
            with ListView1.Items.Add do begin
              Caption := sr.Name;
              ImageIndex := ListView1.Items.Count-1;
            end;
          end;
        until FindNext(sr) <> 0;
        FindClose(sr);
      end;
      img.Free; bmp.Free; pic.Free;
    end;
    l'appele

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      FillListView('C:\images\', '*.jpg');
      FillListView('C:\images\', '*.bmp');
    End;

  2. #2
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour.

    Canvas.StretchDraw est la méthode la plus rapide, mais la plus mauvaise pour un stretching. L'api windows StretchBlt donne un résultat bien meilleur.
    Ensuite tu fais un stretching 80/80 : ok si toutes tes images originales sont carrées, sinon tu crées une distorsion de l'image --> faire un stretch proportionnel, c.à.d. déterminer la hauteur et la largeur de ton bitmap Pic (avec un maximum de 80 pour chacune) à l'échelle de l'original.

    Cordialement
    Thierry

  3. #3
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut
    Merci pour votre intervention
    Dans ce cas, on doit passer par la procedure ResizeBMP

  4. #4
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Voilà, de mémoire, le code que j'utilisais sous Delphi7 pour faire un resize proportionnel.

    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
    function StretchBmp(Source, Dest: TBitmap; MaxWidth, MaxHeight: integer): boolean;
    var
       Scale: double;
    begin
       Result:= false;
       if (Source.Width = 0) or (Source.Height = 0) then Exit;
       Scale:= Min(MaxWidth / Source.Width, MaxHeight / Source.Height); // il faut déclarer uses math
       Dest.Width:=  Round(Source.Width * Scale);
       Dest.Height:= Round(Source.Height * Scale);
       SetStretchBltMode(Dest.Canvas.Handle, HALFTONE);
       Result:= StretchBlt(Dest.Canvas.Handle,
                                 0, 0, Dest.Width, Dest.Height,
                                 Source.Canvas.Handle,
                                 0, 0, Source.Width, Source.Height,
                                 SRCCOPY);
    end;
    Donc dans ton cas, l'appel se fait : StretchBmp(Bmp, Pic, 80, 80)

    Cordialement
    Thierry

  5. #5
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut
    Hi Thierry
    Pour ne pas vous déranger : même avec StretchBmp je ne vois aucune déférence et pour vous faciliter la tache je vous envois le projet ci vous avais biens sure le temps ;
    Je suis très reconnaissant.
    Fichiers attachés Fichiers attachés

  6. #6
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Salut à tous,

    il y a plusieurs problèmes à ton code.

    1. TImageList n'accepte pas des images de différentes taille
    2. tu n'as pas adapté la taille des images dans ImageList1
    3. le code pourrait être optimisé


    voici le code qui corrige les deux premiers problèmes :
    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
    function StretchBmp(Source, Dest: TBitmap; MaxWidth, MaxHeight: integer): boolean;
    var
       Scale: double;
       NewHeight, NewWidth: Integer;            // Ajoué
    begin
       Result:= false;
       if (Source.Width = 0) or (Source.Height = 0) then Exit;
       Scale:= Min(MaxWidth / Source.Width, MaxHeight / Source.Height); // il faut déclarer uses math
       Dest.Width:=  MaxWidth;            // Ajoué
       Dest.Height:= MaxHeight;            // Ajoué
       NewWidth:=  Round(Source.Width * Scale);            // Modifié
       NewHeight:= Round(Source.Height * Scale);            // Modifié
       SetStretchBltMode(Dest.Canvas.Handle, HALFTONE);
       Dest.Canvas.FillRect(Dest.Canvas.ClipRect);
       Result:= StretchBlt(Dest.Canvas.Handle,
                                 (MaxWidth-NewWidth) div 2,             // Modifié
                                 (MaxHeight-NewHeight) div 2,           // Modifié 
                                 NewWidth, NewHeight,
                                 Source.Canvas.Handle,
                                 0, 0, Source.Width, Source.Height,
                                 SRCCOPY);
    end;
     
    procedure FillListView(path: string; mask: string = '*.jpg');
    var
      sr:  TSearchRec;
      img: TPicture;
      bmp: TBitmap;
      pic: TBitMap;
    begin
      img := TPicture.Create;
      bmp := TBitMap.Create;
      pic := TBitMap.Create;
      With Form1 do
      if FindFirst(path + mask, $20, sr) = 0 then
      begin
        repeat
          if (sr.Attr and $20) = $20 then
          begin
            try
              img.LoadFromFile(path + sr.Name);
            except
              Continue;
            end;
            bmp.Assign(img.Graphic);
         //   pic.Width := 80;
         //   pic.Height:= 80;
        //    pic.Canvas.StretchDraw(Rect(0,0,pic.Width, pic.Height), bmp);
           StretchBmp(Bmp, Pic, ImageList1.Width, ImageList1.Height);            // Modifié
            ImageList1.Add(Pic, nil);
            with ListView1.Items.Add do begin
              Caption := sr.Name;
              ImageIndex := ListView1.Items.Count-1;
            end;
          end;
        until FindNext(sr) <> 0;
        FindClose(sr);
      end;
      img.Free; bmp.Free; pic.Free;
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      // ici tu ajustes la taille voulue ... Ex. 80 
      ImageList1.Width := 512;              // Ajoué
      ImageList1.Height := 512;             // Ajoué
      FillListView('C:\images\', '*.jpg');
      FillListView('C:\images\', '*.bmp');
    End;
    Ce code des miniatures de 512 x 512 sans aucun soucis ... testé et compilé sous D7 & D2009.

    @+ Cirec

  7. #7
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 132
    Points
    132
    Par défaut
    bonjour

    Merci ça marche très bien

    Merci a tous

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

Discussions similaires

  1. [Tableaux] Comment agrandir un site en php
    Par rocket_270 dans le forum Langage
    Réponses: 10
    Dernier message: 31/12/2006, 12h15
  2. Réponses: 4
    Dernier message: 28/04/2006, 19h49
  3. Comment agrandir un .swf quand la souris passe dessus
    Par dimitrimm972 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/04/2006, 19h14
  4. Comment agrandir une colonne à 100% en hauteur?
    Par nmathon dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 07/04/2006, 11h54
  5. Comment agrandir la taille de la police d'un site
    Par sofos dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 07/09/2005, 02h11

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