Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по дисциплине Объектно-ориентирован...doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
14.3 Mб
Скачать

2. Форматы графических файлов

Прежде, чем продвигаться дальше, поговорим немного о форматах графических файлов. Delphi поддерживает три типа файлов — битовые матрицы, пиктограммы и метафайлы. Все три типа файлов хранят изображения; различие заключается лишь в способе их хранения внутри файлов и в средствах доступа к ним. Битовая матрица (файл с расширением .bmp) отображает цвет каждого пикселя в изображении. При этом информация хранится таким образом, что любой компьютер может отобразить картинку с разрешающей способностью и количеством цветов, соответствующими его конфигурации.

Пиктограммы (файлы с расширением iсо) — это маленькие битовые матрицы. Они повсеместно используются для обозначения значков приложений, в быстрых кнопках, в пунктах меню, в различных списках. Способ хранения изображений в пиктограммах схож с хранением информации в битовых матрицах, но имеются и различия. В частности, пиктограмму невозможно масштабировать, она сохраняет тот размер, в котором была создана.

Метафайлы (Metafiles) хранят не последовательность битов, из которых состоит изображение, а информацию о способе создания картинки. Они хранят последовательности команд рисования, которые и могут быть повторены при воссоздании изображения. Это делает такие файлы, как правило, более компактными, чем битовые матрицы.

Таблица 26

Delphi может работать со следующими файлами:

Тип файла

Расширение

JPEG Image File

.jpg, .jpeg

Битовые матрицы (Bitmaps)

.bmp

Пиктограммы

.ico

Enhanced Metafiles

.emf

Metafiles

.wmf

3. Классы для хранения графических объектов tPicture, tBitMap, Tlcon и tMetafile

Выше были рассмотрены типы графических файлов. Для хранения графических объектов, содержащихся в битовых матрицах, пиктограммах и метафайлах, в Delphi определены соответствующие классы — TBitMap, Tlcon и TMetafile. Все они являются производными от абстрактного базового класса графических объектов TGraphic. Кроме того, определен класс, являющийся надстройкой над TBitMap, Tlcon и TMetafile и способный хранить любой из этих объектов. Это класс TPicture, с которым вы уже познакомились в начале этой главы. Он имеет свойство Graphic, которое может содержать и битовые матрицы, и пиктограммы, и метафайлы. Более того, он может содержать и объекты определенных пользователем графических классов, производных от TGraphic. Для доступа к графическому объекту можно использовать свойство TPicture.Graphic, но если тип графического объекта известен, то можно непосредственно обращаться к свойствам TPicture.BitМар, TPicture.Icon или TPicture.TMetafile.

Если вы создали свой собственный класс графических объектов, то обращать­ся к его свойствам и методам можно следующим образом:

(Graphic as MyClass).MyProperty

где MyClass — имя введенного вами класса, a MyProperty — имя свойства.

Для всех рассмотренных классов определены методы загрузки из файла и со­хранения в файл:

procedure LoadFromFile(const FileName: string);

procedure SaveToFile(const FileName: string); ,

При этом для классов TBitMap, TIcon и TMetafile формат файла должен соответствовать классу объекта. Объект класса TPicture может оперировать с любым форматом.

Для всех рассмотренных классов определены методы присваивания значений объектов:

procedure Assign(Source: TPersistent) ;

Однако, для классов TBitMap, TIcon и TMetafile присваивать можно только значения однородных объектов: соответственно битовых матриц, пиктограмм, метафайлов. При попытке присвоить значения разнородных объектов генерируется исключение EConvertError. Класс TPicture — универсальный, ему можно присваивать значения объектов любых из остальных трех классов. А значение TPicture можно присваивать только тому объекту, тип которого совпадает с типом объекта, хранящегося в нем.

Пример: Часто в приложениях создается объект типа TBitMap, назначение которого — запомнить содержимое графического изображения и затем восстанавливать его, если оно будет испорчено или изменено пользователем. Код, решающий эту задачу, может иметь вид:

var BitMap:TBitMap;

procedure TForml.FormCreate(Sender: TObject); begin

BitMap:=TBitMap.Create;

BitMap.LoadFromFile('...');

Imagel.Picture.Assign(BitMap) ; end;

procedure TForml.FormDestroy(Sender: TObject); begin

BitMap.Free; end;

procedure SaveClick(Sender: TObject); begin

BitMap.Assign(Imagel.Picture); end;

procedure RestoreClick(Sender: TObject); begin

Imagel.Picture.Assign(BitMap); end;

В этом коде сначала объявляется переменная BitMap типа TBitMap. Затем в момент создания формы (при событии формы OnCreate) в процедуре TForml.FormCreate создается объект BitMap и в него методом LoadFromFile загружается изображение из указанного файла. Затем оператор

Imagel.Picture.Assign(BitMap);

присваивает значение графического объекта свойству Picture компонента Imagel. Изображение тем самым делается видимым пользователю. Этот оператор можно записать иначе:

Imagel.Picture.BitMap.Assign(BitMap);

что даст тот же самый результат.

Если вы создали объект BitMap, то надо не забыть его уничтожить при окончании работы и освободить от него память. Автоматически это не делается. Поэтому надо освобождать память, например, в обработчике события формы OnDestroy (процедура FormDestroy) методом Free:

BitMap.Free;

Если надо переписать в BitMap отредактированное пользователем в Imagel изображение, это можно сделать оператором (процедура SaveClick):

BitMap.Assign(Imagel.Picture);

Если же надо восстановить в Imagel прежнее изображение, испорченное по каким-то причинам, то это можно сделать оператором (процедура RestoreClick):

Imagel.Picture.Assign(BitMap);

Таким образом, мы видим, что методом Assign можно копировать изображение из одного однотипного графического объекта в другой и обратно.

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

procedure LoadFromResourceName(Instance: THandle; const ResName: string);

или

procedure LoadFromResourcelD(Instance: THandle; ResID: Integer);

где ResName — имя графического объекта в файле ресурса, a ResID — его идентификатор.

Например, оператор

BitMapl.LoadFromResourceName(HInstance,'MYBITMAP');

загружает в объект BitMapl из ресурса битовую матрицу с именем «MYBITMAP». Имеются еще методы загрузки и выгрузки графических объектов в поток и в буфер обмена Clipboard, подобные методам работы с файлами. Вы можете посмотреть их во встроенной справке Delphi.