1 Introduction
Nous allons aujourd’hui nous pencher sur un des nombreux espaces de nommage du framework .Net : le System.Drawing.
Cet espace et ses sous-espaces ont pour rôle de fournir des classes puissantes et simples pour encapsuler le GDI+. Ce dernier n’est autre qu’une API riche pour dessiner et gérer tout ce qui a trait à l’image sous Windows.
Dans ce cadre, nous allons mettre en place un programme qui va nous permettre de convertir à la volée des fichiers d’un format graphique vers un autre.
L’interface graphique se présente de la manière suivante :

Nous allons donc découper notre travail en trois étapes :
- Remplir la liste des formats de sortie
- Sélectionner les fichiers à convertir
- Mettre en place la conversion
Pour ce faire, nous allons utiliser les deux espaces de nommages suivants :
- System.Drawing : Permet l’accès aux fonctionnalités de base du GDI+.
- System.Drawing.Imaging : Permet l’accès aux classes de manipulation des images.
Pour notre exemple, nous allons prendre en compte 5 formats : le BMP, le JPEG, le TIFF, le GIF et le PNG. Ces formats sont directement gérés par le GDI+ via des décodeurs et des encodeurs présents sur le système. Dans le cadre d’un format non géré, nous pourrions mettre en œuvre nos propres codeurs et décodeurs via le concept d’héritage.
Le remplissage de la combo de format de sortie s’effectue ainsi :
private void Form1_Load(object sender, System.EventArgs e)
{
// On associe le format à la combobox
formatConversion.Add("BMP", ImageFormat.Bmp);
formatConversion.Add("JPG", ImageFormat.Jpeg);
formatConversion.Add("GIF", ImageFormat.Gif);
formatConversion.Add("TIF", ImageFormat.Tiff);
formatConversion.Add("PNG", ImageFormat.Png);
// On ajoute les entrées dans la combo
cmbSortie.Items.Add("BMP");
cmbSortie.Items.Add("JPG");
cmbSortie.Items.Add("GIF");
cmbSortie.Items.Add("TIF");
cmbSortie.Items.Add("PNG");
}
La variable formatConversion est une table de hachage qui nous permettra de récupérer le bon encodeur selon la chaîne de caractères présente dans la combo. En effet, une table de hachage (Hashtable) permet d’associer une clé à un objet et donc une chaîne de caractères à un format de codage. Le format de codage est une propriété statique de la classe ImageFormat.
La sélection des fichiers à convertir va se faire via la classe OpenFileDialog qui nous donne accès à la boite de dialogue standard de sélection de fichier :
private void cmdChoisir_Click(object sender, System.EventArgs e)
{
// Ouverture d'une fenêtre de dialogue afin de choisir les fichiers
OpenFileDialog frm = new OpenFileDialog();
// Possibilité de multisélection
frm.Multiselect = true;
// Notre filtre
frm.Filter = "Fichiers Images(*.BMP;*.JPG;*.GIF;*.PNG;*.TIF)|*.BMP;*.JPG;*.GIF;*.PNG;*.TIF|Tous (*.*)|*.*";
// Affichage
if (frm.ShowDialog() == DialogResult.OK)
{
// On remplit la liste
lstListe.Items.Clear();
foreach (string fichier in frm.FileNames)
lstListe.Items.Add(fichier);
}
}
Finalement, il ne nous reste plus qu’à parcourir la liste de nos fichiers et à faire appel à la classe Image. Cette dernière possède toutes les bonnes méthodes pour charger où sauvegarder des images.
private void cmdConvertir_Click(object sender, System.EventArgs e)
{
// On positionne la souris en attente
Cursor = Cursors.WaitCursor;
try
{
string format = cmbSortie.SelectedItem.ToString();
foreach (string fichier in lstListe.Items)
{
string extension = fichier.Substring(fichier.Length - 3, 3);
if (extension != format)
{
// On crée le nouveau nom de fichier
string nouveauFichier = fichier.Substring(0, fichier.Length - 3) + format;
// On crée une image GDI+
Image img = Image.FromFile(fichier);
// On sauvegarde selon le bon format
img.Save(nouveauFichier, (ImageFormat)formatConversion[format]);
}
}
// Tout s'est bien passé...
lstListe.Items.Clear();
MessageBox.Show("Conversion réussie avec succés.");
}
catch
{
// En cas d'erreur, on affiche un message à l'utilisateur
MessageBox.Show("Erreur lors de la conversion");
}
Cursor = Cursors.Default;
}
Encore une fois, le fonctionnement se trouve être on ne peut plus simple grâce à l’encapsulation faite par les classes de base du Framework .Net.
Il faut également souligner que le System.Drawing possède énormément de fonctionnalités en ce qui concerne le graphisme 2D et que nous n’avons ici fait qu’effleurer une partie microscopique.