Реферат Курсовая Конспект
Класс TGraphic - раздел Компьютеры, Лекция № 31 Класс 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.
Компонент 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
– Конец работы –
Используемые теги: класс, TGraphic0.05
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Класс TGraphic
Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов