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