Programming delphi - ілюстрований самовчитель по delphi 7 для професіоналів - графічний

Ілюстрований самовчитель по Delphi 7 для професіоналів

Графічний формат JPEG. клас TJPEGImage

У 1988 році був прийнятий перший міжнародний стандарт стиснення нерухомих зображень. Він був названий по імені групи, яка над ним працювала - JPEG (Joint Photographic Expert Group). Справа в тому, що стандартні архіватори (ZIP, ARJ) і традиційні алгоритми стиснення в форматах GIF, TIFF і PCX не можуть досить сильно стиснути півтонову або кольорову картинку (типу фотографії) - максимум в 2-3 рази. Застосований в JPEG алгоритм дозволяє досягти стиснення в десятки разів - правда, при цьому зображення піддається необоротного спотворення, і з нього пропадає частина деталей. Безглуздо (і шкідливо!) Піддавати зберіганню у форматі JPEG креслення, малюнки, а також будь-які зображення з малим числом градацій - він призначений саме для зображень фотографічної якості.

Підтримка формату JPEG реалізована в Delphi за допомогою класу TJPEGImage. який є нащадком класу TGraphic.

Назва TJPEGImage не зовсім вдале. До Timage цей клас не має ні найменшого відношення. Швидше, це "двоюрідний брат" класу TBitmap.

До такого об'єкту пред'являються двоякі вимоги. З одного боку, він повинен підтримувати стиснення даних для запису на диск. З іншого - розпаковані дані в форматі DIB, щоб на вимогу системи отрисовать їх. Тому об'єкт класу TJPEGimage може зберігати обидва види даних, а також проводити їх взаємні перетворення, т. Е. Стиск і розпакування. Для цього в ньому передбачені методи:

Рекомендується викликати метод DIBNeeded заздалегідь, перед отрисовкой картинки - це прискорить процес її виведення на екран.

Крім того, корисно використовувати метод Assign. який дозволяє помістити в клас TJPEGimage об'єкт TBitmap і навпаки:

При цьому відбувається перетворення форматів.

Властивості TJPEGimage можна умовно розділити на дві групи: використовувані при стисненні і при розпакуванні.

Найважливішим із властивостей, потрібних при стискуванні, є compressionQuality:

type TJPEGQualityRange = 1..100;

property CompressionQuaiity: TJPEGQualityRange;

Воно визначає якість стискання зображення і його розмір. При малих значеннях цього властивості файли виходять дуже маленькими, але з великими спотвореннями (нагадаємо, що стандарт JPEG передбачає стиснення з втратами якості). При значеннях, близьких до 100, втрати непомітні, але і розмір файлу при цьому максимальний.

Заздалегідь передбачити розмір стисненого файлу не можна - різні картинки стискуються по-різному, навіть при одному значенні CompressionQuality.

За замовчуванням значення цієї властивості дорівнює 75, що забезпечує розумний компроміс між розміром і якістю.

Крім CompressionQuality. на якість відображення може вплинути і властивість

type TJPEGPerformance = (jpBestQuality, jpBestSpeed);

property Performance: TJPEGPerformance;

Воно потрібно тільки при розпакуванні і відповідає за спосіб відновлення кольорової палітри з стислої інформації. На якість зображення, яке записується воно ніяк не впливає.

Як і у класу TBitmap. у TJPEGimage є властивість

type TJPEGPixelFormat = (jf24Bit, jfSBit);

property PixelFormat: TJPEGPixelForm;

Для даного об'єкту можливих значень всього два-jf8bit і jf24bit. За замовчуванням використовується 24-бітний формат. Якщо інформація про колір не потрібна, то можна встановити властивість Grayscale в значення True - в цьому випадку зображення буде записано (або Розпаковано) в напівтоновому вигляді (256 відтінків сірого).

Властивості ProgressiveEncoding і ProgressiveDisplay визначають спосіб показу зображення при розпакуванні. Перше з них відповідає за порядок запису в файл стислих компонентів. Якщо ProgressiveEncoding встановлено в значення True. починає грати роль властивість ProgressiveDisplay. Від його значення залежить, чи буде показуватися зображення в міру розпакування (при значенні True), або буде спочатку повністю розпаковано, а потім показано (при значенні False).

type TJPEGScale = (jsFullSize, jsHalf, jsQuarter, jsEighth);

property Scale: TJPEGScale;

Досвідчені в графіку фахівці поставлять запитання: навіщо воно? Адже можна прочитати зображення, а потім зменшити його масштаб стандартними способами? Подання інформації в файлах JPEG таке, що можна досить просто витягти зображення відразу в потрібному масштабі. Таким чином досягається подвійний виграш - на часі розпакування і на часі відображення.

Друк растрових зображень може викликати проблеми при узгодженні його розмірів з розмірами аркуша принтера і його дозволом. Більшу частину з них можна зняти, вивчивши приклад, що поставляється з Delphi - jpegProj. Він знаходиться не в папці \ Demos, як зазвичай, а в папці Help \ Examples \ Jpeg.

На закінчення відзначимо, що клас TJPEGimage не має своєї канви для малювання - для цього його потрібно перетворити в класі TBitmap.