begin process at 2010 07 30 10:06:20
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > REDIMENSIONNER UNE IMAGE JPEG

REDIMENSIONNER UNE IMAGE JPEG


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Niveau :Initié Date de création :11/02/2004 Vu :13 939

Auteur : Delphiprog

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Cette fois-ci, il s'agit de redimensionner une image jpeg pour obtenir une nouvelle image jpeg. Cette dernière pourra être utilisée pour :
- affichée dans un contrôle TImage
- être sauvegardée avec ses nouvelles dimensions, pour créer des vignettes par exemple.

Paramètres :
srcJpeg : image source contenant l'image à redimensionner
destJpeg : image redimensionnée
MaxSize : dimension maximale (hauteur ou largeur) déterminée en fonction du cadrage de l'image d'origine.

Source

  • 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;
  • end;
  • end;
  • //exemple d'utilisation
  • procedure TUseBlobsDemoForm.btnLoadImageClick(Sender: TObject);
  • var
  • JpegStream: TStream;
  • Jpeg, JpegTemp: TJpegImage;
  • begin
  • if OpenPictureDialog1.Execute then
  • begin
  • ImgExt := UpperCase(ExtractFileExt(OpenPictureDialog1.FileName));
  • if (ImgExt = '.JPG') or (ImgExt = '.JPEG') then
  • begin
  • JpegTemp := TJpegImage.Create;
  • try
  • Jpeg := TJpegImage.Create;
  • try
  • //charger l'image
  • Jpeg.LoadFromFile(OpenPictureDialog1.FileName);
  • // la redimensionner
  • ResizeJpeg( Jpeg, JpegTemp, ImgMaxWidth);
  • // l'affecter au contrôle visuel
  • Image1.Picture.Assign(JpegTemp);
  • finally
  • Jpeg.Free;
  • end;
  • finally
  • JpegTemp.Free;
  • end;
  • end;
  • // afficher les dimensions de la nouvelle image
  • with Image1 do
  • lblImage.Caption := Format('Image : %d x %d (Hxl)',[Picture.Height, Picture.Width]);
  • end;
  • end;
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;
    end;
end;

//exemple d'utilisation
procedure TUseBlobsDemoForm.btnLoadImageClick(Sender: TObject);
var
  JpegStream: TStream;
  Jpeg, JpegTemp: TJpegImage;
begin
  if OpenPictureDialog1.Execute then
  begin
    ImgExt := UpperCase(ExtractFileExt(OpenPictureDialog1.FileName));

    if (ImgExt = '.JPG') or (ImgExt = '.JPEG') then
    begin
      JpegTemp := TJpegImage.Create;
      try
        Jpeg := TJpegImage.Create;
        try
          //charger l'image
          Jpeg.LoadFromFile(OpenPictureDialog1.FileName);
          // la redimensionner
          ResizeJpeg( Jpeg, JpegTemp, ImgMaxWidth);
          // l'affecter au contrôle visuel
          Image1.Picture.Assign(JpegTemp);
        finally
          Jpeg.Free;         
        end;
      finally
        JpegTemp.Free;
      end;
    end;
    // afficher les dimensions de la nouvelle image
    with Image1 do
      lblImage.Caption := Format('Image : %d x %d (Hxl)',[Picture.Height, Picture.Width]);
  end;
end;

 Conclusion

Explications :
On commence par vérifier que l'image source n'est pas vide et que la dimension maximale n'est pas nulle ou négative.

Ensuite on crée un bitmap, on détermine le cadrage de srcJpeg (ratio). En fonction de ce cadrage, on détermine les dimensions et l'orientation du bitmap.
Après, on étire (StretchDraw) l'image contenue dans srcJpeg pour la faire tenir sur la surface de dessin (Canvas.ClipRect) du bitmap temporaire.
Pour finir, on copie l'image du bitmap temporaire dans l'image JPeg de destination avant de libérer les ressources allouées à Bitmap.

Pour afficher l'image dans un contrôle TImage, s'inspirer de l'exemple ci-dessus.


 Sources du même auteur

Source avec Zip TABLE DE CORRESPONDANCE TYPES DE DONNÉES API/PASCAL OBJET
Source avec Zip Source avec une capture GÉNÉRER DES PDF AVEC DELPHI ET PDF CREATOR
Source avec Zip Source avec une capture DESIGN PATTERN OBSERVER : IMPLÉMENTATION RÉUTILISABLE
Source avec Zip DESIGN PATTERN STRATÉGIE APPLIQUÉ AU CODE "JOURNAL DE DÉBUGG...
Source avec Zip Source avec une capture DESSINER UN RECTANGLE DE SÉLECTION AU DESSUS D'AUTRES COMPOS...

 Sources de la même categorie

Source avec Zip Source avec une capture LABYRINTHE RESOLVER par diglas
Source avec Zip Source avec une capture REMPLISSAGE D'UNE COURBE DE BÉZIER par barbichette
Source avec Zip Source avec une capture DESKTOPICONFLYING par cantador
Source avec Zip Source avec une capture DÉFILEMENT D'UN TEXTE SOUS FORME D'IMAGE SUR UN AFFICHEUR À ... par zwail1
Source avec Zip Source avec une capture CONVERSION PIXEL, MM, INCH, TWIPS, POINT... par yanb

Commentaires et avis

Commentaire de watermodel le 08/04/2006 16:04:02

Chapeau


Avec tes sources j'ai l'impression de devenir plus intelligent.

Commentaire de Descom_q le 12/06/2006 10:04:52

Salut je voulait reprendre un bout de ton code mais quelques mots ne passent pas genre TjpegImage serai-ce qu'il me manque des Uses? Quells sont-ils? En espèrant une réponse merci d'avance et bonne journée.

Commentaire de Delphiprog le 12/06/2006 23:31:29 administrateur CS

Exact Descom_q : j'ai omis de préciser qu'il fallait JPEG dans la clause Uses.
Quand pareil cas se produit, place le curseur sur le nom de la classe recherchée et appuie sur la touche F1. Dans l'aide en ligne, tu trouveras alors, en début de page, quelque chose ressemblant à ceci :
Unité
Jpeg

C'est toujours bon à savoir car on ne peut pas toujours se rappeler dans quelle unité est déclarée telle ou telle classe.

Commentaire de Descom_q le 13/06/2006 10:07:44

Merci ;)!

Commentaire de loran_g le 14/08/2006 09:43:48

Bonjour
quelqu'un sait si on peut faire la meme chose SANS passer par un bitmap ?
merci

Commentaire de pirlouis le 12/02/2007 09:31:53

Bonjour à tous,

Pour ma part j'utilise cette procédure pour réduire une image JPEG vers JPEG.

Cela fonctionne très bien mis à part le fait que l'image se déteriore.

En voulant utiliser cette procédure, je voulait éviter d'utiliser un autre outil tel qu'une vieille version de Paint Shop Pro 7. Ce tools me réduit l'image sans déterioration distinctive.

Exemple une photo JPEG (1704 * 2272) de taille 1.182.445 bytes après réduction JPEG (187 * 250) j'obtiens 24.835 bytes. Avec la procédure citée plus haut j'ai 9.806 bytes.

Est-ce que quelqu'un aurait une idée pour éviter cette déterioration.

Merci d'avance pour vos idées.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Juillet 2010
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales