Очень часто нужно программно уменьшить размер исходного изображение. Например, для создания миниатюр для сайта на 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;
}
...
Комментарии
Отправить комментарий