Redimension d'image en c#

Soyez le premier à donner votre avis sur cette source.

Vue 8 263 fois - Téléchargée 790 fois

Description

Ce programme parcours le dossier dans lequel il se trouve et redimensionne les images

L'utilisateur saisit le coefficient par lequel la taille de l'image sera divisé.

Le code est très commenté et se veut simpliste.

(Dans le zip : un batch pour compiler, la source, l'executable, deux images)

Source / Exemple :


using System;
using System.Windows.Forms; //Application
using System.IO; //Directory et Path
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

public class resize
{
    public static void Main()
    {
        //Ce programme redimensionne toutes les images du dossier
        //This program resize all pictures in the directory

        //csc resize.cs and GO !

        //Have fun ! // http://vince.monkeyz.eu

        int coeff;

        Console.Write("Diviser la taille par : ");
        string res = Console.ReadLine();

        try
        {
            coeff = int.Parse(res); //conversion en entier
        }
        catch
        {
            coeff = 2; //valeur par défaut
        }

        string tab_ext = ".jpg.jpeg.png.bmp.gif.tiff"; //Extensions authorisée
        string[] files = Directory.GetFiles(Application.StartupPath); //Liste des fichiers du dossier

        foreach (string file in files)
        { //file = 1 image

            string ext = Path.GetExtension(file).ToLower();

            if (tab_ext.Contains(ext)) //extension valide ?
                Resize(file, coeff, ext);
            else
                Console.WriteLine(file + " : fichier invalide");
            
        }

        Console.Write("Done");
        Console.ReadKey();
    }

    public static void Resize(string name, int coeff, string ext)
    {
        //Ouverture de l'ancienne image
        FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);
        Bitmap old = (Bitmap)Bitmap.FromStream(fs);
        fs.Close();

        int destWidth = old.Width / coeff;
        int destHeight = old.Height / coeff;

       Bitmap img = new Bitmap(destWidth, destHeight, old.PixelFormat); //Nouvelle image, nouvelle largeur/hauter, ancien PixelFormat

        using (Graphics g = Graphics.FromImage((Image)img))
        {
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.DrawImage(old, 0, 0, destWidth, destHeight);
        } //nota : g.Dispose();

        string path = Application.StartupPath + "\\mini-" + Path.GetFileName(name); // save path (mini-...jpg)

        ImageFormat imgfmt;

        if (ext == ".bmp")
            imgfmt = ImageFormat.Bmp;
        else if (ext == ".gif")
            imgfmt = ImageFormat.Gif;
        else if (ext == ".png")
            imgfmt = ImageFormat.Png;
        else if (ext == ".tiff")
            imgfmt = ImageFormat.Tiff;
        else
            imgfmt = ImageFormat.Jpeg;//Defaut

       img.Save(path, imgfmt);
    }
}

Conclusion :


En modifiant un petit peu le code, il est possible de changer la qualité, de convertir, définir une taille fixe,...

Un problème, une remarque,... n'hésitez pas à commenter

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Utilisateur anonyme
J'ai changé le constructeur et ajouter un FileStream qui contient l'image, comme ça on peut écrire sur un fichier existant.

J'ai lu l'article et je n'avais pas pensé aux comptes limités, mais je laisse comme c'est, je pense que ça reste facile à changer.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
32
Je pense qu'il faut reserver ce constructeur pour la conversion entre données non managées et Bitmap .NET de plus ça nécessite de ne pas détruire le buffer avant la copie.

- Le ctor Bitmap(int width, int height, PixelFormat format) specifie le format et le ctor Bitmap(Image original, Size newSize) s'occupe de la copie tout seul mais definit le format lui même.

- C'est une remarque d'ordre général car le programme peut avoir été installé par un soft ou par un administrateur.

http://blogs.codes-sources.com/coq/archive/2006/02/26/enregistrement-de-param-tres-sauvegardes-etc-en-winform.aspx
Utilisateur anonyme
Bonjour,

Que penses tu de ce bout de code à rajouter au dessus du using ?

BitmapData d = old.LockBits(new Rectangle(0, 0, old.Width, old.Height), ImageLockMode.ReadOnly, old.PixelFormat);
Bitmap b = new Bitmap(destWidth, destHeight,d.Stride, old.PixelFormat, d.Scan0);
old.UnlockBits(d);

Ca permet de garder le PixelFormat orginal.

Pour la première remarque, je ne suis pas sûr de comprendre; l'utilisateur place le programme dans un dossier dans lequel il peut écrire, et donc le programme aussi, non ?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
32
- Ne pas sauvegarder dans le dossier de l'application car très souvent l'utilisateur ne dispose pas des droits en écriture dans ce dossier.

- Attention au constructeur Bitmap( int, int ) qui créer une image au format 32bppArgb ce qui n'est pas forcement le même format que l'image originale.

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.