- •Отображение графической информации с использованием HttpHandler
- •Отображение графической информации с использованием дополнительной страницы
- •Возможности преобразований графических файлов при их отображении на сайте
- •Вывод рисунков на Web сайт
- •Возможности преобразования форматов графических файлов с использованием класса Bitmap
- •Возможности сжатия и трансформации графических файлов, преобразованных в формат jpg
- •Сжатие формата jpg
- •Трансформация файла формата jpg
- •Возможности сжатия графических файлов изменением числа бит на пиксель и их трансформации
- •Использование метода DrawImage для работы с графическими файлами
- •Трансформация и прозрачность изображений
- •Имитация прозрачного фона и вывод рисунков с прозрачным фоном
Возможности сжатия и трансформации графических файлов, преобразованных в формат jpg
Когда мы говорим о сжатии изображений, то понимаем под этим, что речь идет, прежде всего, о формате jpg. JPEG (Joint Photographic Experts Group) создан именно как метод сжатия фотоизображений. Алгоритм JPEG является алгоритмом сжатия с потерей качества. При сохранении JPEG-файла можно указать степень сжатия, которую задают в некоторых условных единицах (в PhotoShop 1-12, в Net 1-100..). Большее число соответствует лучшему качеству, но при этом увеличивается размер файла. Когда речь идет о сжатии других форматов, то это, скорее всего, речь об удалении лишней (служебной) информации из файла (об этих аспектах сжатия мы говорить не будем). Для bmp файлов - это речь о числе бит на пиксель (2*0, 2*4, 2*8,2*24, 2*32) . Методы, применяемые для сжатия битовых матриц, связаны с изменением числа бит на пиксель (оптимизация палитры или "огрубление" цветов). Эти методы дают некоторый эффект и при работе с другими типами файлов - об этом будем говорить в следующем параграфе.
Сжатие формата jpg
Следующий код, помещенный в MakeGraph.aspx.cs, позволяет сначала преобразовать изображение в jpg формат, а затем выполнить сжатие файла с потерей качества и вывод рисунка на web страничку.
public partial class MakeGraph : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string sFileName = string.Empty;
try
{
sFileName = Request.QueryString.Get(0);
}
catch (Exception)
{
Response.End();
return;
}
//Ищем кодек для jpeg
string sMimeType = "image/jpeg";
ImageCodecInfo[] imagecodecinfo = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpimagecodecinfo = null;
//Таким образом можно не только найти, но и посмотреть все кодеки
for (int i = 0; i < imagecodecinfo.Length; i++)
{
if (imagecodecinfo[i].MimeType == sMimeType)
{
jpimagecodecinfo = imagecodecinfo[i];
break;
}
}
if (jpimagecodecinfo == null)
{
Response.End();
return;
}
//Создаем параметр 1, в котором определяем степень сжатия для jpeg 25%
EncoderParameter encoderparameter = new EncoderParameter(Encoder.Quality, (long)25);
EncoderParameters encoderparameters = new EncoderParameters(1);
encoderparameters.Param[0] = encoderparameter;
//Загружаем файл любого формата и преобразуем его в Jpeg
MemoryStream memorystream = new MemoryStream();
System.Drawing.Image image = System.Drawing.Image.FromFile(sFileName);
image.Save(memorystream, ImageFormat.Jpeg);
image.Dispose();
//Помещаем в привычный Bitmap
Bitmap bitmap = new Bitmap(memorystream);
memorystream.Flush();
memorystream = new MemoryStream();
//Вносим сжатие 25%
bitmap.Save(memorystream, jpimagecodecinfo, encoderparameters);
//Выводим сжатый файл на страничку в формате jpg
Response.ContentType = sMimeType;
byte[] b = memorystream.GetBuffer();
Response.BinaryWrite(b);
bitmap.Dispose();
memorystream.Dispose();
}
}
Результат преобразования файла из формата bmp в код в формате jpg и сжатия на 25% показан на Рис.2 справа (слева исходный файл).
Рис.2 Сжатие изображения с потерей качества