К основному контенту

Изменение размера картинок на c#. Проблемы с качеством итогового изображения.

Сегодня расскажу о схеме работы с картинками, которая используется сейчас у меня на работе.

Картинки хранятся в базе в максимальном разрешении. Для вывода на сайте картинка  в зависимости от страницы или блока сжимается до нужного в пикселях размера. Размер пикселей передается в параметрах запроса. На итоговое изображение накладывается watermark, затем картинка кешируется и при повторном обращении уже берется из кеша. В момент отправки клиенту картинке присваивается уникальный Etag и параметры кеширования в браузере. То есть при повторном обращении браузер уже не запрашивает картинку, а берет из дискового кеша.

Недавно мы столкнулись с такой проблемой: при изменении gif картинки, качество ее заметно ухудшалось и те решения, которые успешно работали c jpeg, с gif картинками не давали результатов.

Решение оказалось достаточно простым. После изменения размера для gif картинок нужно устанавливать:
ImageFormat  format = ImageFormat.Png;
context.Response.ContentType = "image/png";

В этом случае сглаживание картинки будет приемлемым для использования на сайте. В остальных случаях ImageFormat должен соответствовать исходному изображению.

P.S. Метод, успешно работающий для изменения размера, а также сглаживания jpeg картинок:

Bitmap bp = new Bitmap(newSize.Width, newSize.Height);
using (Graphics g = Graphics.FromImage(bp))
{
 //Сглаживание и интерполяция
 g.SmoothingMode = SmoothingMode.HighQuality;
 g.InterpolationMode = InterpolationMode.HighQualityBicubic;
 g.PixelOffsetMode = PixelOffsetMode.HighQuality;
 //Изменение размера
 Rectangle rect = new Rectangle(0, 0, thumbSize.Width, thumbSize.Height);
 g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);
}

Комментарии

Отправить комментарий