Choisir le taux de compression d'un jpeg à la sauvegarde

0/5 (1 avis)

Snippet vu 8 566 fois - Téléchargée 27 fois

Contenu du snippet

Ma première idée était d'utiliser la méthode GetThumbnailImageAbort du type Image. Vous trouverez d'ailleurs une explication sur son fonctionnement sur le site des frères Kempé dans la partie astuces.

Malheureusement, la qualité de l'image résultante était pas terrible.

J'ai donc décidé de pour toutes les images du répertoire :

charger le bitmap
créer un autre bitmap de la taille de sortie désirée
effectuer une copie de la photo dans le bitmap
sauvegarder le tout.
Le code est donc le suivant :

Source / Exemple :


Cursor = Cursors.WaitCursor; 
long lngDeb = DateTime.Now.Ticks; 
lstFiles.Items.Clear(); 

//dimensions 
int iWidth; int iHeight; 
if (rb640.Checked) {iWidth=640; iHeight=480;}
else 
{iWidth=320; iHeight=240;} 

//création du répertoire 
string sCurrentPath =Path.GetDirectoryName(Application.ExecutablePath); 
string sNewPath = sCurrentPath + Path.DirectorySeparatorChar + "petit"; 
if (!Directory.Exists(sCurrentPath + Path.DirectorySeparatorChar + "petit"))
{Directory.CreateDirectory(sNewPath);} 

//création d'une image de la taille souhaitée
Bitmap oBSmall = new Bitmap(iWidth,iHeight); 

//récupération de son Graphics pour dessiner dedans
Graphics g = Graphics.FromImage(oBSmall); 

foreach (string sFile in Directory.GetFiles(sCurrentPath, "*.jpg")) 
{ 
      long SizeBefore; 
      long SizeAfter; 

      //sauvegarde de la taille du fichier avant 
      SizeBefore = new FileInfo(sFile).Length; 

      //chargement de l'image
      Bitmap oB = new Bitmap(sFile); 

      //copie de l'image
      g.DrawImage(oB,new Rectangle(0,0,iWidth,iHeight),0,0,oB.Width, oB.Height, System.Drawing.GraphicsUnit.Pixel); 

      string sNewFileName = sNewPath + Path.DirectorySeparatorChar + Path.GetFileName(sFile); 
      if (File.Exists(sNewFileName)){File.Delete(sNewFileName);} 

      oBSmall.Save(sNewFileName); 

      
      oB.Dispose(); 

      //sauvegarde de la taille du fichier après 
      SizeAfter = new FileInfo(sNewFileName).Length; 

      //affichage du résultat dans un ListBox
      lstFiles.Items.Add(string.Format("{0} {1}->{2}",Path.GetFileName(sFile),SizeBefore/1024,SizeAfter/1024));

      Application.DoEvents(); 
} 
g.Dispose(); 
oBSmall.Dispose(); 

MessageBox.Show("Fini en " + ((DateTime.Now.Ticks - lngDeb)/10000000).ToString() + " s, ma puce ;-)"); 
Cursor = Cursors.Default;

Conclusion :


Cela marchait bien, l'image était bonne, mais le problème est que la taille des fichiers obtenus n'était pas satisfaisante (genre 220Ko pour une image 640 x 480).

Par défaut (enfin je pense), le taux de compression utilisé pour ce fichier jpeg était de 100%, hors on peux diminuer ce taux sans avoir de grandes pertes de qualité d'image.

Comment agir alors sur ce taux ? C'est là toute l'astuce de cet article.

Il faut donc utiliser une autre signature de la méthode Save qui attends des paramètres supplémentaires. Autant le dire tout de suite, j'ai trouvé cette astuce dans l'aide en ligne.

Dans un premier temps, on va récupérer les informations d'encodage du codec pour jpeg grâce à la méthode suivante :

private ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for(j = 0; j < encoders.Length; ++j)
{
if(encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}

A voir également

Ajouter un commentaire Commentaire
Messages postés
103
Date d'inscription
lundi 8 juillet 2002
Statut
Membre
Dernière intervention
24 novembre 2005

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.