Известно, что стандарт JPEG предусматривает сжатие с потерями
качества. Примененный в JPEG алгоритм позволяет достичь сжатия в
десятки раз – правда, при этом изображение подвергается необрати-
мому искажению, и из него пропадает часть деталей. Бессмысленно
подвергать хранению в формате JPEG чертежи, рисунки, а также лю-
бые изображения с малым числом градаций – он предназначен именно
для изображений фотографического качества.
Поддержка формата JPEG реализована в Delphi посредством класса
TJPEGImage, который описан в модуле JPEG (подключается в uses).
Свойства класса TJPEGImage можно условно разделить на две
группы: используемые при сжатии и при распаковке. Некоторые из
них описаны в табл. 1.9.
Таблица 1.9. Некоторые свойства класса TJPEGImage
К объекту класса TJPEGImage предъявляются двоякие требования.
С одной стороны, он должен поддерживать сжатие данных для записи
на диск, с другой — распакованные данные в формате DIB, чтобы по
требованию системы отрисовать их. Поэтому объект класса
TJPEGimage может хранить оба вида данных, а также производить их
взаимные преобразования, т. е. сжатие и распаковку. Для этого в нем
предусмотрены методы:
procedure Compress;
procedure DIBNeeded;
procedure JPEGNeeded;
Рекомендуется вызывать метод DIBNeeded заранее, перед отрисов-
кой картинки — это ускорит процесс ее вывода на экран.
Следует отметить, что класс TJPEGImage не имеет своей канвы для
рисования — для этого его нужно преобразовать в класс TBitmap. Для
этого полезно использовать метод Assign, который позволяет помес-
тить в класс TBitmap объект TJPEGImage и наоборот:
MyBitmap.Assign(MyJPEGImage);
MyJPEGImage.Assign(MyBitmap);
При этом происходит преобразование форматов.
Пример. Создадим конвертер картинок из формата .bmp в формат
.jpeg. Для этого понадобится компоненты: TImage (для просмотра кар-
тинок), две кнопки TButton (для открытия диалога выбора картинок и
для запуска процесса), TTrackBar (для того чтобы устанавливать каче-
ство картинки) и TOpenDialog. Для OpenDialog1 настроим фильтр,
чтобы можно было открывать только картинки в формате .bmp.
Обработчик события OnClick для первой кнопки может иметь та-
кой вид:
procedure TForm1.Button1Click(Sender: TObject);
begin
if Opendialog1.Execute
then Image1.Picture.LoadFromFile(OpenDialog1.FileName);
end;
Далее необходимо написать основную часть программы, то есть
создание jpeg-изображения. Все действия будем производить по щелч-
ку на второй кнопке. Необходимо будет создать объект типа TJpegImage,
провести с ним необходимые действия, а потом с помощью ме-
тода Compress, упаковать изображение и остается только сохранить
изображение в файл. Еще необходимо настроить свойства TrackBar'a:
свойство Max надо сделать равным 100 и свойство Position равным
также 100. Тогда обработчик нажатия на вторую кнопку может быть
таким:
procedure TForm1.Button2Click(Sender: TObject);
var
jpg: TJpegImage;
begin
jpg:=TJpegImage.Create; //создаем экземпляр объекта
//присваиваем ему изображение
jpg.Assign(Image1.picture.graphic);
//устанавливаем степень сжатия (качество) 1..100
jpg.CompressionQuality:=TrackBar1.Position;
jpg.Compress; //упаковываем графику
jpg.SaveToFile('C:\Pic\first.jpg'); //сохраняем графику
jpg.free; //уничтожаем экземпляр объекта
end;
|