Redimensionner une image jpeg

Soyez le premier à donner votre avis sur cette source.

Snippet vu 20 731 fois - Téléchargée 27 fois

Contenu du snippet

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 / Exemple :


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.

A voir également

Ajouter un commentaire

Commentaires

oumaya2007
Messages postés
4
Date d'inscription
jeudi 16 août 2007
Statut
Membre
Dernière intervention
15 juillet 2010

Bonjour
Un petite amélioration :

procedure ResizeJpeg(srcJpeg, destJpeg: TJpegImage; const MaxSize: integer);
var
Bitmap ,Bmp2: 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;
Bmp2 := TBitMap .Create;
try
// Convertion du jpg en Bmp
Bmp2.Width := srcJpeg.Width ;
Bmp2.Height := srcJpeg.Height ;
Bmp2.PixelFormat:=pf24bit;
Bmp2.Canvas.Draw(0,0,srcJpeg);

{ 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);
// Réduction d'image avec filtre
Bitmap.PixelFormat:=pf24bit;
//stretch
ImgStretch(Bmp2, Bitmap,ResampleFilters[5].Filter, ResampleFilters[5].Width);
{ //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;
Bmp2.Free;
end;
end;
cs_pirlouis
Messages postés
2
Date d'inscription
mercredi 3 septembre 2003
Statut
Membre
Dernière intervention
6 septembre 2007

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.
loran_g
Messages postés
2
Date d'inscription
jeudi 19 août 2004
Statut
Membre
Dernière intervention
11 mai 2011

Bonjour
quelqu'un sait si on peut faire la meme chose SANS passer par un bitmap ?
merci
Descom_q
Messages postés
16
Date d'inscription
vendredi 7 avril 2006
Statut
Membre
Dernière intervention
13 juillet 2006

Merci ;)!
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
26
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.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.