Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ4 ЛабграфWEB_.doc
Скачиваний:
7
Добавлен:
14.05.2015
Размер:
415.23 Кб
Скачать

Возможности сжатия и трансформации графических файлов, преобразованных в формат 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 Сжатие изображения с потерей качества