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

Composants VCL Delphi Discussion :

Redimensionner une image


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut Redimensionner une image
    Bonjour,

    j'aimerais savoir comment l'on peut redimensionner une image et la sauvegarder en un nouveau fichier ?

    Ex.: image d'origine = 1024x768, image redimensionnée en 300x200.

    Merci,

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 941
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 941
    Par défaut
    Avec l'API StretchBlt.
    Il faut jouer sur les largeur/hauteur de destination si tu veux une image proportionnelle.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    Ou je trouve ca StretchBit ?

    Y a t-il un exemple a quelque part ?

    Merci

  4. #4
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 668
    Par défaut
    salut,
    j'aimerais savoir comment l'on peut redimensionner une image et la sauvegarder en un nouveau fichier ?

    Ex.: image d'origine = 1024x768, image redimensionnée en 300x200.
    voici un exemple qui répond à ton besoin.
    D'abord, on ouvre l'image et puis on va ma redimensionner en 300x200.
    1-mets un "OpenPictureDialog" qui servira à ouvrir l'image.
    2-mets un"Image" sur ta fiche qui servira à visualiser ton image.
    3-ajoute un bouton "ouvrir" et ajoute ce 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ImageSourceBMP  : TBitmap;
      ImageCibleBmp   : TBitmap;
      RectCible       : TRect;
      NouvLargeur, NouvHauteur:Integer;
    begin
     OpenPictureDialog1.execute;
        if OpenPictureDialog1.FileName = '' then
        else
          Image1.Picture.LoadFromFile(OpenPictureDialog1.filename);
     
      NouvLargeur:=300;// nouvelle  taille de la largeur de l'image
      NouvHauteur:=200;//nouvelle  taille de la hauteur de l'image
     
      RectCible.Left:=0;
      RectCible.Top:=0;
      RectCible.Right     :=NouvLargeur;
      RectCible.Bottom    :=NouvHauteur;
     
      ImageSourceBMP:=nil;
      ImageCibleBmp:=nil;
      try
        ImageSourceBMP := TBitmap.Create;
        ImageCibleBmp  := TBitmap.Create;
     
        ImageSourceBMP.Width  := Image1.Picture.Width;  // détermination de la taille de ImageBMP
        ImageSourceBMP.Height := Image1.Picture.Height;
        ImageSourceBMP.Canvas.Draw(0,0,Image1.Picture.Graphic); // On dessine dans ImageBMP
     //Fin de création du ImageSourceBMP
     
        ImageCibleBmp.Width  :=NouvLargeur;
        ImageCibleBmp.Height :=NouvHauteur;
     
        Image1.Width     :=NouvLargeur; // si on veut voir toute l'image à l'écran
        Image1.Height    :=NouvHauteur; // autre solution : mettre son autosize à true.
     
        ImageCibleBmp.Canvas.StretchDraw(RectCible,ImageSourceBmp); // là on redessine avec une autre taille
      // Fin de création de ImageCibleBMP
     
        Image1.Picture.Assign(ImageCibleBMP);
      Finally
        ImageSourceBMP.Free;
        ImageCibleBmp.Free;
      end;
     
    end;
    pour sauvegarder l'image avec les nouvelles dimensions, il suffit d'ajouter ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    Image1.Picture.SaveToFile('c:\le nom ton image.bmp');
    end;
    A+

    NABIL74

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    Est-ce que cela fonctionnera en Jpg ou jpeg ?

    Merci

  6. #6
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 668
    Par défaut
    je l'ai testé sur les images bmp mais pas sur les jpeg...
    je ne peux pas la testé maintenant car je n'ai pas delphi là où je suis.

    a+

    NABIL74

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2003
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 146
    Par défaut
    Pour commencer, ta réduction ne sera pas bonne. Tu dois garder le même facteur de grandeur (4:3) 1024 Large X 768 Haut a un facteur normal pour une photo (1024 *3 / 4 = 768). 300 X 200 ne l'a pas (300 * 3 / 4 =225. Tu obtiendrais une photo déformé. Les appareils photos ont généralement ce facteur de grandeur.

    Pour le code, voici un extrait de code que j'utilise pour la réduction ou agradissement.
    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
    Procedure TPrinc.Redimentionne;
      Var
        jpg :TJpegImage;
        Bmp,Bmp2 :TBitMap;
        Photo :String;
      begin
        Jpg := TJpegImage.Create;
        Bmp := TBitMap.Create;
        Bmp2:= TBitMap.Create;
        ext:=uppercase(ext); //vient  d'un TOpenPictureDialog: Ext:= ExtractFileExt(ouvrir.FileName)
        Try
          SavePictureDialog1.FileName:='';
          if ext='.BMP' then bmp2.LoadFromFile(Ouvrir.filename)
          else jpg.LoadFromFile(Ouvrir.filename);
          Bmp.Width :=Large;  //largeur défini par un TRadioButton
          Bmp.Height:=Haut;  // Hauteur défini par le même TRadioButton
          if ext='.BMP' then Bmp.Canvas.StretchDraw(Bmp.Canvas.ClipRect,Bmp2)
          else Bmp.Canvas.StretchDraw(Bmp.Canvas.ClipRect,Jpg);
          if ext='.BMP' then
          begin
            Bmp2.Assign(Bmp);
            SavePictureDialog1.FilterIndex:=4;
            SavePictureDialog1.DefaultExt:='.bmp';
          end else
          begin
            Jpg.Assign(Bmp);
            SavePictureDialog1.FilterIndex:=2;
            SavePictureDialog1.DefaultExt:='.jpg';
          end;
          Photo:=ExtractFileName(Ouvrir.Filename);
          if SavePictureDialog1.Execute then if uppercase(ext)='.BMP' then
          BMP.SavetoFile(SavePictureDialog1.FileName)else
          JPG.SavetoFile(SavePictureDialog1.FileName);
        Finally
          { libération des ressources}
          Jpg .Free;
          Bmp .Free;
          Bmp2.Free;
        end;
      end;
     
    // Chaque RadioButton a une valeur différente
     
    procedure TPrinc.RadioButton1Click(Sender: TObject);
      begin
        if RadioButton1.Checked=true then      // si checked false, pas d'action
        begin
          if large > haut then
          begin
            Large:=320;
            Haut:=240;
          end else
          begin
            Large:=240;
            Haut:=320;
          end;
          LabelInfo.Caption:='Redimentionner en '+IntToStr(Large)+' X '+IntToStr(Haut);
          BtnConfirm.Enabled:=True;
        end;
      end;

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 941
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 941
    Par défaut
    Voici une autre fonction utilisant un TPicture. Tous les types d'image sont ainsi supportés (pour autant que les bonnes unités soient dans le Uses).

    L'image est sauvée en gardant les proportions.

    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
    uses Math, Jpeg;
     
    function ResizeImage(const aFileIn, aFileOut :TFileName; const aMaxWidth, aMaxHeight: integer): boolean;
    var
      Scale :real;
      Pict  :TPicture;
      Bmp   :TBitmap;
    begin
      Result := FALSE;
     
      if FileExists(aFileIn) then
      begin
        Pict := TPicture.Create;
        Bmp  := TBitmap.Create;
     
        try
          Pict.LoadFromFile(aFileIn);
     
          Scale := Min(aMaxWidth /Pict.Width, aMaxHeight /Pict.Height);
     
          Bmp.Width  := Round(Pict.Width  *Scale);
          Bmp.Height := Round(Pict.Height *Scale);
     
          Bmp.Canvas.StretchDraw(Rect(0,0, Bmp.Width, Bmp.Height), Pict.Graphic);
     
          Pict.Assign(Bmp);
          Pict.SaveToFile(aFileOut);
     
          Result := TRUE;
        finally
          Pict.Free;
          Bmp.Free;
        end;
      end;
    end;
    A noter que cette fonction ne fait pas de conversion de types. Le format de sortie doit être le format d'entrée !

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    Concernant ta réponse Andnotor, serait-il compliqué de traduire cela en C++ avec Borland ?

    Car j'utilise BC++Builder pour faire mon programme. Je sais que c'est semblable mais bon, j'aurais besoin d'un petit coup de main

    Merci

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    Personne ne peut m'aider à ce sujet ?

    Merci

  11. #11
    Fxg
    Fxg est déconnecté
    Membre émérite
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 513
    Par défaut
    Il aurait peut être mieux valu poster sur forum c++ que Delphi non ?

Discussions similaires

  1. [VB.NET] Redimensionner une image dans un PictureBox
    Par Monster77 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/04/2007, 18h24
  2. [32 bits] Redimensionner une image JPEG/GIF/PNG...
    Par CR_Gio dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 04/10/2005, 00h57
  3. Redimensionner une image...
    Par RhaZieL dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 22/07/2005, 09h30
  4. [VB.NET] Redimensionner une image proportionnelement
    Par Monster77 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/10/2004, 12h10
  5. [MX2004] redimensionner une image lors du chargement
    Par ouinouin dans le forum Flash
    Réponses: 8
    Dernier message: 18/02/2004, 18h32

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