Битовые образы

End.

Begin

Begin

Begin

Begin

Begin

Var

Implementation

Var

Public

Private

Type

Uses

Interface

Листинг . Слайд-проектор

unitshpic_;

Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, Menu

TForm1 = class(TForm) Image1: ТImage;

Button1: TButton;

procedureFormActivate(Sender: TObject);

procedureButtonlClick(Sender: TObject);

{ Private declarations }

{ Public declarations }

end;

Form1: TForm1;

aSearchRec : TSearchRec;

aPath : String;// каталог, в котором находятся иллюстрации

aFile : String;// файл иллюстрации

iw,ih: integer; // первоначальный размер компонента Image

$R *.DFM}

// изменение размера области вывода иллюстрации

// пропорционально размеру иллюстрации

ProcedureScalelmage;

pw, ph : integer; // размер иллюстрации

scaleX, scaleY : real; // масштаб по Х и Y

scale : real; // общий масштаб

// иллюстрация уже загружена

// получим ее размеры

pw := Form1.Image1.Picture.Width;

ph := Form1.Image1.Picture.Height;

ifpw > iw // ширина иллюстрации больше ширины компонента Image

thenscaleX := iw/pw // нужно масштабировать

elsescaleX := 1;

if ph > ih // высота иллюстрации больше высоты компонента

then scaleY := ih/ph // нужно масштабировать

elsescaleY := 1;

// выберем наименьший коэффициент

if scaleX < scaleY

thenscale := scaleX

elsescale := scaleY;

// изменим размер области вывода иллюстрации

Form1.Image1.Height := Round(Form1.Image1.Picture.Height*scale)

Form1.Image1.Width := Round(Form1.Image1.Picture.Width*scale);

// т. к. Strech = True и размер области пропорционален

// размеру картинки, то картинка масштабируется без искажений

end;

// вывести первую иллюстрацию

procedureFirstPicture;

var

r : integer; // результат поиска файла

aPath := 'f:\temp\';

r := FindFirst(aPath+'*.bmp',faAnyFile,aSearchRec);

if г = 0 then

begin// в указанном каталоге есть bmp-файл

aFile := aPath + aSearchRec.Name;

Form1.Image1.Picture.LoadFromFile(aFile); // загрузить

// иллюстрацию

Scalelmage; //-установить размер компонента

Image r := FindNext(aSearchRec); // найти следующий файл

if r = 0 then// еще есть файлы иллюстраций

Forml.Button1.Enabled := True;

end;

end;

// вывести следующую иллюстрацию

ProcedureNextPicture();

var

r : integer;

aFile := aPath + aSearchRec.Name;

Forml.Image1.Picture.LoadFromFile(aFile);

Scalelmage;

// подготовим вывод следующей иллюстрации

r := FindNext(aSearchRec); // найти следующий файл

ifr<>0

then// больше нет иллюстраций

Forml.Buttonl.Enabled := False;

end;

procedureTForml.FormActivate(Sender: TObject);

Image1.AutoSize := False; // запрет автоизменения размера компонента

Image1.Stretch := True; // разрешим масштабирование

// запомним первоначальный размер области вывода иллюстрации

iw := Imagel.Width;

in := imagel.Height;

Button1.Enabled := False; // сделаем недоступной кнопку Дальше

FirstPicture; // вывести первую иллюстрацию

end;

//щелчок на кнопке Дальше

procedureTForm1.Button1Click(Sender: TObject);

NextPicture;

end;

Программа выполняет масштабирование выводимых иллюстраций без искажения, чего нельзя добиться простым присвоением значения True свойству strech. Загрузку и вывод первой и остальных иллюстраций выполняют соответственно процедуры FirstPicture и NextPicture. Процедура FrirstPicture использует функцию FindFirst для того, чтобы получить имя первого BMP-файла. В качестве параметров функции FindFirst передаются:

Ø имя каталога, в котором должны находиться иллюстрации;

Ø структура asearchRec, поле Name которой, в случае успеха, будет содержать имя файла, удовлетворяющего критерию поиска;

Ø маска файла иллюстрации.

Если в указанном при вызове функции FindFirst каталоге есть хотя бы один BMP-файл, значение функции будет равно нулю. В этом случае метод LoadFromFiie загружает файл иллюстрации, после чего вызывается функция scaieimage, которая устанавливает размер компонента пропорционально размеру иллюстрации. Размер загруженной иллюстрации можно получить, обратившись к свойствамForm1.Image1.Picture.Width и Form1.Шmage1.Picture.Height, значения которых не зависят от размера компонента Image.

При работе с графикой удобно использовать объекты типа TBitMap (битовый образ). Битовый образ представляет собой находящуюся в памяти компьютера, и, следовательно, невидимую графическую поверхность, на которой программа может сформировать изображение. Содержимое битового образа (картинка) легко и, что особенно важно, быстро может быть выведено на поверхность формы или области вывода иллюстрации (image). Поэтому в программах битовые образы обычно используются для хранения небольших изображений, например, картинок командных кнопок. Загрузить в битовый образ нужную картинку можно при помощи метода LoadFromFlie, указав в качестве параметра имя BMP-файла, в котором находится нужная иллюстрация. Например, если в программе объявлена переменная pic типа TBitMap, то после выполнения инструкции

pic.LoadFromFiie('е:\images\aplane.bmp')

битовый образ pic будет содержать изображение самолета.

Вывести содержимое битового образа (картинку) на поверхность формы или области вывода иллюстрации можно путем применения метода Draw к соответствующему свойству поверхности (canvas). Например, инструкция

Image1.Canvas.Draw(x,у, bm)

выводит картинку битового образа bm на поверхность компонента image 1 (параметры х и у определяют положение левого верхнего угла картинки на поверхности компонента).

Если перед применением метода Draw свойству Transparent объекта TBitMap присвоить значение True, то фрагменты рисунка, окрашенные цветом, совпадающим с цветом левого нижнего угла картинки, не будут выведены — через них будет как бы проглядывать фон. Если в качестве "прозрачного" нужно использовать цвет, отличный от цвета левой нижней точки рисунка, то свойству Transparentcoior следует присвоить значение символьной константы, обозначающей необходимый цвет.

Следующая программа, текст которой приведен в листинге7, демонстрирует использование битовых образов для формирования изображения из нескольких элементов.