Класс TMetafileCanvas
Холст метафайла является потомком уже известного нам класса TCanvas. В сотрудничестве с TMetafile класс TMetafileCanvas способен решить задачу по созданию новых и редактированию существующих рисунков векторной графики. Перечень свойств и методов практически полностью соответствует возможностям родительского класса TCanvas, за исключением следующего.
У класса TMetafileCanvas переопределен конструктор:
constructorCreate(AMetafile: TMetafile; ReferenceDevice: HDC);
Конструктор создает экземпляр холста метафайла и выделяет ему дескриптор. Параметр AMetafile соответствует объекту TMetafile; параметр ReferenceDevice – дескриптор графического устройства.
procedureNewMetafile;
varmtf:TMetaFile;
Begin
Try
mtf:=TMetaFile.Create;
WithTMetaFileCanvas.Create(mtf,0) do
Begin
Brush.Color := clRed;
Ellipse(0,0,100,100);
Brush.Color := clYellow;
Rectangle(25,25,50,50);
Destroy;
end;
Form1.canvas.draw(0,0,mtf);
mtf.savetofile('C:\Metafile.emf');
Finally
mtf.free;
end;
end;
Процедура NewMetafile создает векторный рисунок из двух объектов: красного эллипса и желтого квадрата, затем сохраняет метафайл в формате EMF. Еще одно дополнение класса TMetafileCanvas – конструктор, отвечающий за внесение в метафайл справочной текстовой информации (вспомните свойства класса TMetafile: CreatedBy и Description):
constructorCreateWithComment(AMetafile: TMetafile; ReferenceDevice: HDC; constCreatedBy, Description: string);
Класс TMetafileCanvas
Холст метафайла является потомком уже известного нам класса TCanvas. В сотрудничестве с TMetafile класс TMetafileCanvas способен решить задачу по созданию новых и редактированию существующих рисунков векторной графики. Перечень свойств и методов практически полностью соответствует возможностям родительского класса TCanvas, за исключением следующего.
У класса TMetafileCanvas переопределен конструктор:
constructorCreate(AMetafile: TMetafile; ReferenceDevice: HDC);
Конструктор создает экземпляр холста метафайла и выделяет ему дескрип-
тор. Параметр AMetafile соответствует объекту TMetafile; параметр Reference-Device – дескриптор графического устройства.
procedureNewMetafile;
varmtf:TMetaFile;
Begin
Try
mtf:=TMetaFile.Create;
WithTMetaFileCanvas.Create(mtf,0) do
Begin
Brush.Color := clRed;
Ellipse(0,0,100,100);
Brush.Color := clYellow;
Rectangle(25,25,50,50);
Destroy;
end;
Form1.canvas.draw(0,0,mtf);
mtf.savetofile('C:\Metafile.emf');
Finally
mtf.free;
end;
end;
Процедура NewMetafile создает векторный рисунок из двух объектов: красного эллипса и желтого квадрата, затем сохраняет метафайл в формате EMF. Еще одно дополнение класса TMetafileCanvas – конструктор, отвечающий за внесение в метафайл справочной текстовой информации (вспомните свойства класса TMetafile: CreatedBy и Description):
constructorCreateWithComment(AMetafile : TMetafile; ReferenceDevice : HDC; constCreatedBy, Description: string);
Класс TJPEGImage
Класс TJPEGImage инкапсулирует возможности популярного в Интернете и в домашней электронной фотографии формата сжатой растровой картинки Windows, называемого JPEG (Joint Photographic Expert Group). Формат JPEG был специально разработан для хранения 24-битных изображений в файлах малого размера. Метод сжатия, используемый в JPEG-файлах, допускает некоторые потери качества изображения, причем, чем больше степень сжатия, тем больше необратимые ухудшения.
Для поддержки проектом Delphi сжатых картинок подключите к нему модуль Jpeg. К особенностям класса TJPEGImage следует отнести: отсутствие у него холста (хотя объект JPEG может нарисовать себя на холсте других объектов); класс не обеспечивает попиксельного доступа к своему растровому изображению; благодаря объекту TJPEGData допускает совместное использование своего дескриптора. Объект JPEG обязан не только сжимать растровые изображения, но и отображать распакованные данные в формате DIB. Самый простой вариант взаимодействия между сжатой и обычной растровыми картинками осуществляется при помощи метода Assign():
procedureAssign(Source: TPersistent);
В этом случае выполняется автоматическое конвертирование формата из DIB в JPEG или наоборот. Например:
varJPG: TJPEGImage;
…
JPG.Assign(Image1.Picture.Bitmap);
JPG.SaveToFile('c:\Picture.jpg')
Для преобразования рисунка в формате JPEG в DIB предназначен метод:
procedureDIBNeeded;
Обычно процедура используется перед вызовом метода Draw() холста. Такой подход ускоряет прорисовку картинки. Например:
varJPG: TJPEGImage;
…
JPG.DIBNeeded;
Form1.Canvas.Draw(0,0,JPG);
Обратное преобразование из DIB в JPEG осуществляется методом:
procedureJPEGNeeded;
Для сжатия обычного растрового изображения в формат JPEG прежде всего надо установить качество сжатия. Для этой цели в классе TJPEGImage опубликовано свойство:
typeTJPEGQualityRange = 1..100;
propertyCompressionQuality : TJPEGQualityRange;
Чем больше значение CompressionQuality, тем меньше потерь качества изображения, но больше размер результирующего файла. С уменьшением этого значения степень сжатия возрастает, но и ухудшается рисунок. По умолчанию значение качества сжатия равно 90.
Сжатие растровой картинки осуществляется методом Compress. Процедура Compress() автоматически вызывается при сохранении объекта JPEG в файл и поток.
procedureCompress;
Два взаимосвязанных свойства определяют способ вывода изображения на экран: по мере распаковки (такой метод называют прогрессивной разверткой) или только по завершении распаковки.
propertyProgressiveEncoding: Boolean;
propertyProgressiveDisplay: Boolean;
Прогрессивная развертка картинки (ProgressiveDisplay = true) возможна только при условии, что файл сохранен в режиме прогрессивного сжатия (ProgressiveEncoding = true). При использовании прогрессивной развертки допустимо сглаживание изображения:
propertySmoothing: Boolean;
Качество изображения зависит не только от степени сжатия растровой картинки. Ряд свойств класса определяет работу TJPEGImage при декомпрессии и показе изображения. Критерий скорость распаковки/качество изображения задается в свойстве:
propertyPerformance: TJPEGPerformance;
typeTJPEGPerformance = (jpBestQuality, jpBestSpeed);
При выборе значения jpBestQuality на распаковку файла затрачивается несколько больше времени, но зато получается более качественная картинка. Выбор в пользу jpBestSpeed дает обратный результат. На качество сохраняемого изображения Performance не влияет. Критерий скорость вывода изображения/глубина цветов задается в свойстве:
propertyPixelFormat: TJPEGPixelFormat;
typeTJPEGPixelFormat = (jf24Bit, jf8Bit);
При выборе значения jf24Bit вы получите полнокровное 24-битное изображение, но на его вывод затратите значительно больше времени, чем на 8-битное. Наряду с уже известным нам методом TCanvas StretchDraw(), позволяющим масштабировать графические объекты (потомки класса TGraphic), класс TJPEGImage поддерживает свой, более эффективный (быстрый) способ масштабирования:
propertyScale : TJPEGScale;
typeTJPEGScale = (jsFullSize, jsHalf, jsQuarter, jsEighth);
В соответствии со значениями TJPEGScale вы получите изображение в соотношении 1:1, 1:2, 1:4 и 1:8 к размерам исходной картинки.
Дата добавления: 2016-03-15; просмотров: 897;