Вывод иллюстраций
Наиболее просто вывести иллюстрацию, которая находится в файле с расширением bmp, jpg или ico, можно при помошикомпонента image, значоккоторого находится на вкладке Additional палитры (рис. 10.11).
Рис. 10.11. Значок компонента image

В табл. 10.8 перечислены основные свойства компонента image.
Иллюстрацию, которая будет выведена в поле компонента image, можно задать как во время разработки формы приложения, так и во время работы программы.

Во время разработки формы иллюстрация задается установкой значения свойства picture путем выбора файла иллюстрации в стандартном диалоговом окне, которое появляется в результате щелчка на командной кнопке Load окна Picture Editor (рис. 10.12). Чтобы запустить Image Editor, нужно в окне Object Inspector выбрать свойство Picture и щелкнуть на кнопке с тремя точками.
Если размер иллюстрации больше размера компонента, то свойству strech нужно присвоить значение True и установить значения свойств width и Height пропорционально реальным размерам иллюстрации.
Чтобы вывести иллюстрацию в поле компонента image во время работы программы, нужно применить метод LoadFromFile к свойству Picture, указав в качестве параметра имя файла иллюстрации.
Например, инструкция
1.Forml.Imaqel.Picture.LoadFromFile('e:\tenp\bart.bmp')
загружает иллюстрацию из файла bart.bmp и выводит ее в поле вывода иллюстрации (image1).
Метод LoadFromFile позволяет отображать иллюстрации различных графических форматов: BMP, WMF, JPEG (файлы с расширением jpg).
Следующая программа, ее текст приведен в листинге 10.6, использует компонент image для просмотра иллюстраций, которые находятся в указанном пользователем каталоге. Диалоговое окно программы приведено на рис. 10.13.
Рис. 10.12. Окно Picture Editor

Рис. 10.13. Слайд-проектор

Листинг 10.6. Слайд-проектор
001.unit shpic_;002.interface003.uses004.Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs, ExtCtrls, StdCtrls, Menu005.type006.TForml = class(TForm)007.ImageIt Tlmage;008.Buttonl: TButton;009.procedure FormActivate(Sender: TObject);010.procedure ButtorilClickfSender: TObject);011.private012.{ Private declarations }013.public014.{Public declarations }015.end;016.var017.Form1: TForm1;018.aSearchRec : TSearchRec;019.aPath : String; // каталог, в котором находятся иллюстрации020.aFile : String; // файл иллюстрации021.iw,ih: integer; // первоначальный размер <a href="http://delphicomponent.ru/" title="компонента" target="_blank">компонента</a> Image022.implementation023.{$R *.DFM}024.// изменение размера области вывода иллюстрации025.// пропорционально размеру иллюстрации026.Procedure Scalelmage;027.var028.pw, ph : integer; // размер иллюстрация029.scaleX, scaleY : real; // масштаб по Х и Y030.scale : real; // общий масштаб031.begin032.// иллюстрация уже загружена033.// получим ее размеры034.pw := Forml.ImageI.Picture.Width;035.ph := Forml.Imagel.Picture.Height;036.if pw > iw // ширина иллюстрации больше ширины <a href="http://delphicomponent.ru/" title="компонента" target="_blank">компонента</a> Image037.then scaleX := iw/pw // нужно масштабировать038.else scaleX := 1;039.if ph. > ih // высота иллюстрации больше высоты <a href="http://delphicomponent.ru/" title="компонента" target="_blank">компонента</a>040.then scaleY := ih/ph // нужно масштабировать041.else scaleY := 1;042.// выберем наименьший коэффициент043.if scaleX < scaleY044.then scale := scaleX045.else scale := scaleY;046.// изменим размер области вывода иллюстрации047.Forml.Imagel.Height ;= Round(Forml.Imagel.Picture.Height'scale);048.Forml.Imagel.Width := Round(Forml.Imagel.Picture.Width*scale);049.// т. к. Strecfi = True и размер области пропорционален050.// размеру картинки, то картинка масштабируется без искажений051.end;052.// вывести первую иллюстрацию053.procedure FirstPicture;054.var055.г : integer,- // результат поиска файла056.begin057.aPath := 'f:\temp\';058.г := FindFirst |aPath+'*.bmp',faAnyFile,aSearchRec);059.if г = 0 then060.begin // в указанном каталоге есть Ьюр~файл061.aFile := aPath + aSearchRec.Name,-062.Forml.Imagel.Picture.LoadFromFile(aFile); // загрузить063.// иллюстрацию064.Scalelmage; // установить размер <a href="http://delphicomponent.ru/" title="компонента" target="_blank">компонента</a> Image065.г := FindNext(aSearchRec); // найти следующий файл066.if г = 0 then // еще есть файлы иллюстраций067.Forml.Buttonl.Enabled := True;068.end;069.end;070.// вывести следующую иллюстрацию071.Procedure NextPicture();072.var073.г : integer;074.begin075.aFile := aPath + aSearchRec.Name;076.Forml. Imagel.Picture.LoadFromFile(aFile);077.Scalelmage;078.// подготовим вывод следующей иллюстрации079.г :- FindNext(aSearchRec); // найти следующий файл080.if г О О081.then // больше нет иллюстраций082.Forml.Buttonl.Enabled := False;083.end;084.procedure TForml.Formftctivate{Sender: TObject);085.begin086.Imagel.AutoSize := False; // запрет автоизменения размера <a href="http://delphicomponent.ru/" title="компонента" target="_blank">компонента</a>087.Imagel.Stretch := True; // разрешим масштабирование088.// запомним первоначальный размер области вывода иллюстрации089.iw := Imagel.Width;090.in :- imagel.Height;091.Buttonl.Enabled := False; // сделаем недоступной кнопку Дальше092.FirstPicture; // вывести первую иллюстрацию093.end;094.// щелчок на кнопке Дальше095.procedure TForml.ButtonlClick(Sender: TObject);096.begin097.NextPicture;098.end;099.end.Программа выполняет масштабирование выводимых иллюстраций без искажения, чего нельзя добиться простым присвоением значения True свойству strech. Загрузку и вывод первой и остальных иллюстраций выполняют соответственно процедуры FirstPicture и NextPicture. Процедура FirstPicture использует функцию FindFirst для того, чтобы получить имя первого BMP-файла.
В качестве параметров функции FindFirst передаются:
- имя каталога, в котором должны находиться иллюстрации;
- структура aSearchRec, поле нате которой, в случае успеха, будет содержать имя файла, удовлетворяющего критерию поиска;
- маска файла иллюстрации.
Если в указанном при вызове функции FindFirst каталоге есть хотя бы один BMP-файл, значение функции будет равно нулю. В этом случае метод LoadFromFile загружает файл иллюстрации, после чего вызывается функция scaieimage, которая устанавливает размер компонента пропорционально размеру иллюстрации. Размер загруженной иллюстрации можно получить, обратившись К свойствам Form1. Image1. Picture. Width И Form1.image1.Picture.Height, значения которых не зависят от размера компонента Image.
Битовые образы
При работе с графикой удобно использовать объекты типа TBitMap (битовый образ). Битовый образ представляет собой находящуюся в памяти компьютера, и, следовательно, невидимую графическую поверхность, на которой программа может сформировать изображение. Содержимое битовогообраза (картинка) легко и, что особенно важно, быстро может быть выведено на поверхность формы или области вывода иллюстрации (image). Поэтому в программах битовые образы обычно используются для хранениянебольших изображений, например, картинок командных кнопок.
Загрузить в битовый образ нужную картинку можно при помощи метода LoadFromFile, указав в качестве параметра имя BMP-файла, в котором находится нужная иллюстрация.
Например, если в программе объявлена переменная pic типа TBitMap, топосле выполнения инструкции
1.pic.LoadFromFile Се; \images\aplane.brap1)
битовый образ pic будет содержать изображение самолета.
Вывести содержимое битового образа (картинку) на поверхность формы или области вывода иллюстрации можно путем применения метода Draw к соответствующему свойству поверхности (canvas).
Например, инструкция
1.Image1 .Canvas.Draw(x,у, bm)
выводит картинку битового образа bm на поверхность компонента Image1 (параметры х и у определяют положение левого верхнего угла картинки на поверхности компонента).
Если перед применением метода Draw свойству Transparent объекта TBitMap присвоить значение True, то фрагменты рисунка, окрашенные цветом, совпадающим с цветом левого нижнего угла картинки, не будут выведены — через них будет как бы проглядывать фон. Если в качестве "прозрачного" нужно использовать цвет, отличный от цвета левой нижней точки рисунка, то свойству Transparentcoior следует присвоить значение символьной константы, обозначающей необходимый цвет.
Следующая программа, текст которой приведен в листинге 10.7, демонстрирует использование битовых образов для формирования изображения из нескольких элементов.
Листинг 10.7. Использование битовых образов
01.unit aplanes_;02.interface03.uses04.Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs;05.type06.TForm1 = class(TForm)07.procedure FormPaint(Sender: TObject);08.private09.{ Private declarations }10.public11.( Public declarations }12.end;13.var14.Form1: TForm1;15.sky,aplane: TBitMap; // битовые образы: небо и самолет16.implementation17.{$R *.DEM}18.procedure TForml.FormPaint(Sender: TObject);19.begin20.// создать битовые образы21.sky := TBitMap.Create;22.aplane := TBitMap.Create;23.// загрузить картинки24.sky.LoadFromFile('sky.bmp'|;25.aplane.LoadFromFlle('aplane.bmp');26.Fonru.Canvas.Draw(0, 0, sky) ; // отрисовка фона27.Forml.Canvas.Draw(20,20,aplane); // отрисовка левого самолета28.aplane.Transparent:=True;29.// теперь элементы рисунка, цвет которых совпадает с цветом30.// левой нижней точки битового образа, не отрисовываются31.Forral.Canvas.Draw(120,20,aplane); // очрисовка правого самолета32.// освободить память33.sky.free;34.aplane.free;35.end;end.
После запуска программы в окне приложения (рис. 10.14) появляется изображение летящих на фоне неба самолетов. Фон и изображение самолета — битовые образы, загружаемые из файлов. Белое поле вокруг левого самолета показывает истинный размер картинки битового образа aplane. Белое поле вокруг правого самолета отсутствует, т. к. перед его выводом свойству Transparent битового образа было присвоено значение True.
Рис. 10.14. Влияние значение свойства Transparent на вывод изображения

