Ілюстрований самовчитель по 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.