Создание миниатюр изображений на платформе .NET

Очень часто нужно программно уменьшить размер исходного изображение. Например, для создания миниатюр для сайта на ASP.NET. На платформе .NET это сделать достаточно просто, используя пространство имен System.Drawing.


using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

...

private MemoryStream ChangeImageSize(MemoryStream ms, int width, int heigth)
{
    var mm = new MemoryStream();

    using (var bmp = new Bitmap(ms))
    {
        var imgPhoto = (System.Drawing.Image)bmp;

        if (bmp.Height == bmp.Width)
            width = heigth;
        if (bmp.Height > bmp.Width && bmp.Height != 0)
            width = (bmp.Width * heigth) / bmp.Height;
        if (bmp.Height < bmp.Width && bmp.Width != 0)
            heigth = (bmp.Height * width) / bmp.Width;

        // Настраиваем Encoder, для преобразования графики
        var qualityEncoder = Encoder.Quality;
        var parameterList = new EncoderParameters(1);
        var qualityParameter = new EncoderParameter(qualityEncoder, 50L);
        parameterList.Param[0] = qualityParameter;

        // Пусть будет JPEG, хотя можно определять кодек по расширению файла.
        var codec = (ImageCodecInfo)GetEncoder(ImageFormat.Jpeg);

        // Создаем пустую канву. Измененная графика будет записана в эту канву.
        using (var bmPhoto = new Bitmap(width, heigth))
        {
            bmPhoto.SetResolution(10, 10);
            using (var grPhoto = Graphics.FromImage(bmPhoto))
            {
                grPhoto.SmoothingMode =
                     System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
                grPhoto.InterpolationMode =
                     System.Drawing.Drawing2D.InterpolationMode.High;
                grPhoto.PixelOffsetMode =
                     System.Drawing.Drawing2D.PixelOffsetMode.HighSpeed;
                grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, width, heigth), 0, 0,
                    bmp.Width, bmp.Height, GraphicsUnit.Pixel);

                // Сохраняем файл в память, а затем убеждаемся, 
                // что все ресурсы освобождены корректно.
        
                bmPhoto.Save(mm, codec, parameterList);
            }
        }    
    }

    return mm;
}

...

Комментарии