Класс TGraphic

Лекция № 31

Класс TGraphic

TGraphic = class(TPersistent)

Этот абстрактный класс является родительским для трех видов изображений, общепринятых в графике Windows — значка (класс TIcon), метафайла (класс TMetafile) и растровой картинки (класс TBitmap).

Метод procedure Assign(Source: TPersistent) - переопределяет одноименный метод предка, позволяя полиморфное присваивание графических объектов (см. ниже).

Загрузку и выгрузку графики в поток осуществляют методы:

procedure LoadFromStream(Stream: TStream);

procedure SaveToStream(Stream: TStream);

а загрузку и выгрузку в файл:

procedure LoadFromFile(const Filename: string) ;

procedure SaveToFile(const Filename: string);

Эти методы создают соответствующий файловый поток и затем вызывают методы LoadFromStream/SaveToStream.

Два метода осуществляют взаимодействие с буфером обмена:

procedure LoadFromClipboardFormat(AFomat: Word; AData: THandle;APalette: HPALETTE);

procedure SaveToCiipboardPormat(var AFormat: Word; var AData:

THandle; var APalette: HPALETTE);

Здесь AFormat — используемый графический формат; AData и APalette _ данные и палитра (если она требуется). Потомок должен иметь свой формат и уметь обрабатывать данные, представленные в нем.

Свойство

Empty: Boolean; устанавливается в True, если графический объект пуст (в него не загружались данные).

Высота и ширина графического объекта: свойства Height: Integer; Width: Integer;

Для каждого дочернего типа значения этих свойств вычисляются своим способом. Наконец, свойство Modified: Boolean; показывает, модифицировался ли данный графический объект. Это свойство устанавливается в True внутри обработчика события OnChange.

 

Программное построение изображений

MoveTo(XH, YH) - установка невидимого курсора в начало линии; LineTo(XK, YK) - проведение линии до точки XK,YK. Обращение к этим методам осуществляется по общим правилам - с помощью составного имени, например, если имя объекта…

Компонент PaintBox (класс TPaintBox)

На странице System есть компонент TPaintBox, который можно использовать для построения приложений типа графического редактора или, например, в качестве места построения графиков. Компонент TPaintBox является самой простой надстройкой над холстом. Можно даже рассматривать его как холст, снабженный атрибутами компонента. Он представлен свойством Canvas: TCanvas;

помимо холста, компонент имеет свой цвет (фона)- свойство Color: Tcolor,и шрифт - свойство Font: TFont;

Координаты указателя мыши, передаваемые в обработчики соответствующих событий (OnMouseMove и др.), являются относительными, т.е. это смещение мыши относительно левого верхнего угла объекта TPaintBox, а не относительно левого верхнего угла формы.

Пример1

. Как осуществить доступ к отдельной точке на изображении (на холсте).

procedure TForm1.Button1Click(Sender: TObject);

var

i, j : Longint;

begin

Button1.Enabled:=False;

with Canvas do

for i:=1 to Width do begin

Application.ProcessMessages;

for j:=1 to Height do

Pixels[i,j]:=i*j;

end;

Button1.Enabled:=True;

end;

Пример использования методов, выводящих изображение - DrawиStretchDraw:

Прорисовка изображений происходит в обработчике события OnPaint для формы:

procedure TForm1.FormPaint(Sender: TObject);

begin

with Canvas do begin

Draw(0,0, Image1.Picture.BitMap);

StretchDraw(Rect(250,0,350,50),Image1.Picture.BitMap)

end;

end;

 

Класс TPicture

TPicture – это полнофункциональный класс, который инкапсулирует в себе все необходимое для работы с графическими изображениями (значком, растром, метафайлом). Его свойство Graphic может содержать объект любого из этих типов, то есть это свойство обеспечивает доступ к графическим объектам указанных типов. Свойства Htight и Width определяют высоту и ширину изображения в пикселах.

Если в поле Graphic хранился объект одного класса, а затребован другого, то прежний объект уничтожается, а вместо него создается пустой объект нужного класса.

Перечислим остальные методы и свойства:

 

procedure LoadFromFile(const Filename: scring); Анализирует расширение имени файла FileName и, если оно известно (зарегистрировано), то создается объект нужного класса и вызывается его метод LoadFromFile. В противном случае возникает исключительная ситуация EInvalidGraphic. Стандартными расширениями являются .ICO, .WMF и .BMP.

 

procedure SaveToFile(const Filename: string); Сохраняет графику в файле Filename.

 

procedure LoadFromClipboardFormat(var AFormat: Word; var AData: THandle; var APalette: HPALETTE) ;

Ищет в буфере обмена (clipboard) зарегестрированный формат Aformat и если формат найден, загружает из буфера изображение Adata и его палитру Apalette.

. Стандартно зарегистрированных форматов два: битовое изображение и метафайл.

 

procedure SaveToClipboardFormat(var AFormat: Word; var AData: THandle; var APalette: HPALETTE; Сохраняет графическое изображение Adata и его цветовую палитру APalette в буфере обмена в формате AFormat.

 

procedure Assign(Source: TPersistent) ;

Связывает собственный графический объект Graphic с объектом Source. Присваиваемый объект может быть класса как TPicture, так и TGraphic или любого его потомка. Кроме того, параметр Source может быть равен nil — в этом случае поле Graphic очищается с удалением прежнего объекта.

 

Все три разновидности графических объектов имеют свои системы кэширования. Это означает, что на один реально существующий в системе (и занимающий долю ресурсов!) дескриптор могут одновременно ссылаться несколько объектов. Реализуется такое связывание через метод Assign. Выражение Iconi.Assign(Icon2); означает, что два этих объекта разделяют теперь один значок.

Более простым является кэширование для TIcon и TMetafile, которые умеют только отображать себя и не предназначены для редактирования (создатели Delphi считают, что дескриптор графического объекта дается программисту не для того, чтобы ковыряться в нем на уровне двоичных кодов). Гораздо сложнее устроен механизм кэширования для TBitmap, который имеет свою канву для рисования.

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

Кого-то может удивить отсутствие объявленных методов рисования вроде Draw у TIcon, TMetafile и TBitmap. Такие методы есть, но они недоступны. Все рисование должно осуществляться через вызовы методов Draw и StretchDraw холста, содержащго графику, ибо холст несет тот контекст, в котором должна осуществляться операция. Рассмотрим предопределенные графические классы.

 

Класс TMetafile

TMetafile = class(TGraphic)

Инкапсулирует свойства стандартного метафайла Windows. В нем перекрываются методы Assign, LoadFromStream, SaveToStream, LoadFromClipboardFormat, SaveToClipboardFormat. В буфер обмена объект помещает свое содержимое в формате CF_METAFILEPICT. Помимо общих, класс имеет свойства:

Handle: типа HMETAFILE; Дескриптор метафайла.

Inch: типа Word; Число точек на дюйм в координатной системе метафайла. Связано с установленным режимом отображения.

 

Класс TIcon

TIcon = class(TGraphic)

Инкапсулирует значок Windows. Не пытайтесь изменить размеры значка — они постоянны (равны GetSystemMetrics(SM_CXICON) и GetSystemMetrics(SM_CYICON)), и при попытке присвоить новые значения возникает исключительная ситуация EInvalidGraphicOperation. Значок нельзя также читать и писать в буфер обмена, так как в Windows нет соответствующего формата. В этом классе перекрываются методы класса TGraphic: Assign, LoadFromStream и SaveToStream. Дополнительно также определены:

свойство Handle: HICON; дскриптор значка.

метод ReleaseHandle: типа HICON; Метод "отдает" дескриптор — возвращает значение дескриптора, обнуляя ссылку на него в объекте.

 

Класс TBitmap

TBitmap = class(TGraphic)

Класс соответствует битовой карте, зависимой от устройства (Device — dependent bitmap, DDB). В нем перекрываются методы Assign, LoadFromClipboardFormat, LoadFromStream, SaveToClipboardFormat, SaveToStream. Объект взаимодействует с буфером обмена в формате CF_BITMAP. Холст битовой карты доступен через свойство Canvas: TCanvas;

Обратите внимание на то, что другие потомки TGraphic холста не имеют. С его помощью можно рисовать на поверхности изображения.

Дескрипторы битовой карты и ее палитры доступны как свойства: Handle: HBITMAP; Palette: HPALETTE;

Два метода: function ReleaseHandle: HBITMAP; и function ReleasePalette: HPALETTE;возвращают дескрипторы битовой карты и палитры и после этого обнуляют соответствующие поля, т. е. как бы "отдают" дескрипторы пользователю.

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

procedure Dormant — выгружает изображение в поток и уничтожает дескрипторы битовой карты и палитры,

procedure Freelmage — "освобождает" дескриптор битовой карты для дальнейшего использования и внесения изменений. Это означает, что если на данный дескриптор есть ссылки, то он дублируется; поток очищается.

Битовая карта может быть монохромной и цветной, что определено свойством:

property Monochrome: Boolean - Значение True соответствует монохромной битовой карте. При его изменении происходит преобразование содержимого к требуемому виду.

"Фоновый" цвет битовой карты определяется свойством TransparentColor: TColor;

Это тот цвет, который можно отменить в операции BrushCopy, чтобы она выглядела прозрачной. Для монохромной карты этот цвет — белый.

Функции для работы с графикой.

В модуле GRAPHICS сосредоточен целый ряд полезных функций:

function GraphicFilter(GraphicClass: TGraphicClass): string; Эту функцию удобно использовать вместе с диалогами открытия и закрытия файла. Для заданного класса GraphicClass она вернет строку, которую сразу можно присвоить свойству Filter диалога. Например, для TBitmap она вернет строку 'Bitmaps (*.BMP)|*.BMP'.

function GraphicExtension(GraphicClass: TGraphicClass): string; Возвращает строку, содержащую расширение, которое встречается у файлов в формате GraphicClass. Например, GraphicExtension(TIcon) равно строке 'ICO'.

function ColorToRGB(Color: TColor): Longint; Преобразует значение типа TColor в формат RGB.

 

function ColorToIdent(Color: Longint; var Ident: string): Boolean; function IdentToColor(const Ident: string; var Color: Longint):Boolean; Функции взаимного преобразования цвета в строку с его названием (определенным в модуле GRAPHICS). Например, ColorToIdent(clWhite, AString) присвоит AString значение 'clWhite'. В случае неуспеха возвращается False;

function ColorToString(Color: Tcolor): string; function StringToColorfS: string): TColor; Назначение аналогично двум предыдущим функциям. При отсутствии цвета Color в списке предопределенных цветов возвращается строка с его значением в шестнадцатиричном формате. При отсутствии цвета с именем S (в том же списке) делается попытка преобразовать строку в число, в случае неудачи возникает исключительная ситуация.

 

Для преобразования битовой карты из зависимого от устройства формата DDB в независимый (DIB) предназначены две функции:

 

procedure GetDIBSizes(Bitmap: HBITMAP; var InfoHeaderSize: Integer; var ImageSize: Longint); Возвращает размер заголовка изображения и размер самого изображения. Значение InfoHeaderSize равно размеру структуры TBitmapInfoHeader плюс, при необходимости, размеру палитры (каждый элемент которой TRGBQuad занимает 4 байта). В ImageSize возвращается коли­чество байт, которое нужно отвести для получения изображения в формате DIB

 

function GetDIBfBitmap: HBITMAP; Palette: HPALETTE; var Bitmaplnfo; var Bits): Boolean; Преобразует DDB (определенную через Bitmap и Palette) в DIB. Заголовок помещается в Bitmaplnfo, а сами данные — в Bits