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 :

Redimensionner un TJpegImage


Sujet :

Delphi

  1. #1
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut Redimensionner un TJpegImage
    bonjour à tous,

    je charge certains TJpegImage par LoadFromFile, et j'aimerais redimensionner ceux-ci.
    En effet j'ai certains Jpeg d'une résolution de 7162 x 5781 par exemple....! (28 Mo)

    Est ce possible ?

    Merci d'avance.

  2. #2
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut Redim JPEG
    Bonjour.

    La méthode à utiliser pour redimensionner une image JPEG, est de passer par un intémédiaire BITMAP (Un JPEG est un bitmap compressé, et une fois décompressé pour la l'affichage, c'est de nouveau un BITMAP). C'est la méthode StretchDraw qu'il faut utiliser. Enfin, c'est la plus simple, j'en ai d'autres. Attention au piège des grandes dimentions, StretchDraw plante pour de grandes différences de dimentions.
    Voici deux codes que j'utilise dans un de mes programmes (ConvertSerie).


    La meilleur méthode pour charger un JPEG dans un TBitMap.
    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
     
    {----------------------------------------------------------------------------}
    Procedure TForm1.ChargeImageJPEG(Nom : String;Image : TImage);
    Var
      ImageJPEG   : TJPEGImage;
      ImageBmp    : TBitMap;
     
    Begin
       ImageJPEG:=TJPEGImage.Create;
       Try
         ImageJPEG.LoadFromFile(Nom);
         ImageBmp:=TBitMap.Create;
         Try
           ImageBmp.Assign(ImageJPEG);
           Image.Picture.BitMap.Assign(ImageBmp);
     
          finally
           ImageBmp.Free;
         end;
        Finally
         ImageJPEG.Free;
       end;
    End;
    {----------------------------------------------------------------------------}
    Pour redimentionner et sauver.

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
     
    {----------------------------------------------------------------------------}
    Function TForm1.SauveVignete(Nom : String) : TPoint;
    Var
       GIF            : TGifImage;
       Image          : TJPEGImage;
       R              : Word;
       Ext,ID         : String;
       Image2         : TImage;
       BMP            : TBitMap;
       TypeDim1,
       TypeDim2        : Integer;
       CompresseTGA,
       Valide,Change  : Boolean;
       IW,IH,Fact,W,H : Double;
     
    Begin
       Change:=True;
       W:=120;   H:=90;
       IW:=Image1.Picture.Width;
       IH:=Image1.Picture.Height;
       Valide:=False;
       Fact:=1;
       Ext := LowerCase(ExtractFileExt(Nom));
     
       Image2:=TImage.Create(Self);
       Case RadioGroup1.ItemIndex Of
       0 : TypeDim1 := 1;
       1 : TypeDim1 := 2;
       End;
     
       If TypeDim1 = 1 Then //120*90
        begin
           ID:='_120';
           If Not CheckRatio.Checked Then
            begin
               W:=120;
               H:=90;
            end
           Else
            begin
              If IW > IH Then
                Fact:=120 / IW
               Else Fact:=90 / IH;
            end;
        end;
     
       If TypeDim1 = 2 Then //160x100
        begin
           ID:='_160';
           If Not CheckRatio.Checked Then
            begin
               W:=160;
               H:=100;
            end
           Else
            begin
               If IW > IH Then
                Fact:=160 / IW
               Else Fact:=100 / IH;
            end;
        end;
     
      If Fact=0 Then Fact:=1;
       If Change Then
        begin
           W:=(IW * Fact);
           H:=(IH * Fact);
           If ((IW * IH) > 4000000) And ((W * H) < 90000) Then // Passer par une réduction intermédiaire
                                                               // Indispensable pour éviter le plantage 
                                                               // de la méthode StretchDraw. 
            begin
               BMP:=TBitMap.Create;
               BMP.Width:=Image1.Picture.Bitmap.Width Div 10;
               BMP.Height:=Image1.Picture.Bitmap.HeiGht Div 10;
               BMP.Canvas.StretchDraw(Rect(0,0,BMP.Width,BMP.Height),Image1.Picture.Graphic);
     
               If Bilineaire Then
                begin
                   REDIMENSIONNEMENT_Bilineaire(BMP,Round(W) - 1,Round(H)- 1);
                   Image2.Picture.BitMap.Assign(BMP);
                end
               Else
                begin
                   Image2.Picture.BitMap.Width:=Round(W);
                   Image2.Picture.BitMap.Height:=Round(H);
                   Image2.Picture.BitMap.Canvas.StretchDraw(Rect(0,0,Round(W),Round(H)),BMP);
                end;
               BMP.Free;
     
            end
           Else
            begin
               Image2.Picture.BitMap.Width:=Round(W);
               Image2.Picture.BitMap.Height:=Round(H);
               Image2.Picture.BitMap.Canvas.StretchDraw(Rect(0,0,Round(W),Round(H)),Image1.Picture.Graphic);
            end;
        end
       Else Image2.Picture.Bitmap.Assign(Image1.Picture.Graphic);
     
       If FileExists(Nom) Then
         begin
            R:=MessageDLG('Le fichier image ' + Nom + ' existe !' +
                       #10 + #13 +
                       'Voulez vous remplacer, ou abandonner les opérations ?',
                       mtConfirmation,[mbYes,mbNo,mbAbort],0);
            If R = mrAbort Then
             begin
                Image2.Free;
                Exit;
             end;
            If R = mrNo Then Valide:=False;
            If R = mrYes Then
             begin
                DeleteFile(Nom);
                Valide:=True;
             end;
         end
        Else Valide:=True;
       If Valide Then
        begin
           If Ext='.bmp' Then Image2.Picture.BitMap.SaveToFile(Nom);
     
           If Ext='.jpg' Then
            begin
               Try
                 Image:=TJPEGImage.Create;
                 Try
                  Case Image2.Picture.BitMap.PixelFormat Of
                  pf15bit,pf16bit,pf24bit,
                  pf32bit,pfcustom,pfdevice :Image.PixelFormat:=jf24bit;
                  Else Image.PixelFormat:=jf8bit;
                  End;
                  Image.CompressionQuality:=Qualite;
                  Image.Assign(Image2.Picture.BitMap);
                  Image.SaveToFile(Nom);
                 Except
                  Image.Free;
                end;
               Except
              end;
            end;
     
        end;
       Application.ProcessMessages;
       Image2.Free;
       Result.x := Round(W);
       Result.y := Round(H);
    End;
    //-------------------------------------------------------------------------
    Avec ça, tu devrais t'en sortir.


  3. #3
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Bonjour et merci Philippe.
    Je vais tester ton code, mais il me semble que c'est la meilleure solution en effet.
    J'ai d'ailleurs également trouvé cette procédure qui ressemble à la tienne et qui permet de redimensionner un jpeg :

    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
     
    {* Redimensionne un JPEG avec comme width le MaxSize *}
    procedure ResizeJpeg(srcJpeg, destJpeg: TJpegImage; const MaxSize: integer);
    var
      Bitmap: TBitmap;
      Ratio: double; 
    begin
      {Si l'image est vide ou la largeur est nulle, sortir}
      if (srcJpeg.Empty) or (MaxSize <= 0) then
        Exit;
     
        { Création d'un TBitmap le temps de redimensionner l'image }
        Bitmap := TBitmap.Create;
        try
          { Détermination du cadrage Vertical ou horizontal}
          Ratio := srcJpeg.Height / srcJpeg.Width;
          if Ratio > 1 then 
            //Cadrage vertical
            Bitmap.Width := Round(MaxSize / Ratio)
          else
            //cadrage horizontal
            Bitmap.Width := MaxSize;
          Bitmap.Height := Round(Bitmap.Width * Ratio); 
          //Copie de l'image avec redimensionnement sur le canvas du TBitmap 
          Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect, srcJpeg); 
          {Il ne reste plus qu'à copier l'image redimensionnée dan le Jpeg
           à retourner}
          destJpeg.Assign(Bitmap); 
        finally
          Bitmap.Free;                   //désallocation memoire
        end; 
    end;

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut! J'ai une démo qui pourrait t'intéresser. Elle te donne le code pour passer d'un jpeg à un bitmap et inversement. Elle possède quelques fonctions basiques, filtres & zoom.
    http://sub0.developpez.com/delphi/jpeg_shell.zip
    Le filtre anti-aliasing est un flou légé en fait, mais aujourd'hui, j'utiliserai plutot un redimensionnement avec un vrai anti-aliasing...
    Dans la démo suivante, l'image est redimensionnée avec un filtre anti-alisaing (plusieurs choix possible) en fonction des dimensions de la fenêtre. La qualité du résultat n'a rien à voir avec un redimensionnement sans filtre :
    http://sub0.developpez.com/delphi/AAlias2.zip.zip

    à+

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

Discussions similaires

  1. [Kylix] TJpegImage
    Par sdolard dans le forum EDI
    Réponses: 3
    Dernier message: 16/01/2003, 18h35
  2. [VB6] [Interface] Redimensionnement automatique
    Par ychalan dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2002, 18h32
  3. redimensionnement d'une JWindow
    Par mbp566 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 02/08/2002, 03h41
  4. Redimensionnement des Paquets IP sur un Réseau Local
    Par Bonoboo dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 15h40
  5. Redimensionnement d'une surface
    Par Freakazoid dans le forum DirectX
    Réponses: 4
    Dernier message: 01/07/2002, 22h01

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