Битовый образ – это находящаяся в памяти компьютера картинка,
которую можно быстро вывести на поверхность формы или в область
отображения иллюстрации. Создать битовый образ можно путем за-
грузки из файла (*.bmp, *.jpg, *.gif), ресурса или путем копирования из
другого графического объекта (например, Image). В программе бито-
вый образ представляет собой объект типа TBitMap.
Битовые образы удобно использовать при работе с графикой.
При работе с битовыми образами нужно:
1) объявить переменную типа TBitMap (например, Var bm: TBitMap);
2) создать битовый образ можно с помощью метода Create, напри-
мер, bm:=TBitmap.Create;
3) загрузить битовый образ из файла можно с помощью метода
LoadFromFile(), указав в качестве параметра имя bmp-файла, в
котором хранится изображение. Например, после выполнения
оператора bm.LoadFromFile('Picture.bmp') битовый образ bm
будет содержать изображение из файла Picture.bmp;
4) вывести битовый образ на поверхность формы или в область ком-
понента путем применения метода Draw или StretchDraw к свой-
ству Canvas. Например, инструкция
Image1.Canvas.StretchDraw(Rect(0, 0, Image1.Width,
Image1.Height), bm);
выводит битовый образ bm на поверхность компонента Image1,
изменяя его размеры так (растягивая или сжимая), чтобы битовый
образ полностью отобразился в компоненте.
Инструкция
Image2.Canvas.Draw(x, y, bm);
выводит битовый образ bm на поверхность компонента Image2.
Первые два параметра метода определяют положение верхнего уг-
ла картинки на графической поверхности компонента.
Для битового образа можно задать прозрачный цвет. Делается это
с помощью его свойств TransparentColor и Transparent. При этом
точки картинки, цвет которых совпадает с прозрачным, при выводе
битового образа не отображаются. Так для того, чтобы сделать желтый
цвет прозрачным, надо написать инструкции:
bm.TransparentColor:=clYellow;//задан прозрачный цвет
bm.Transparent:=true; //разрешен прозрачный цвет
Если не указывать прозрачный цвет, то при использовании инст-
рукции bm.Transparent:=true, в качестве прозрачного будет исполь-
зован цвет, совпадающий с цветом левой нижней точки рисунка.
Рассмотрим пример, демонстрирующий работу с битовыми образ-
ами. Создадим приложение, в котором на фоне воды в случайном мес-
те при прорисовке формы появляется изображение рыбки (рис. 1.5).
Фон и изображение рыбки – битовые образы, загруженные из файлов.
Рис. 1.5. Объект и фоновый рисунок
Листинг программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, ExtCtrls,
StdCtrls, XPMan, ColorGrd;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormClose(Sender: TObject; var Action:
TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
water: TBitmap; //фоновая картинка воды
fish: TBitmap; //картинка с рыбой
p_exit: boolean; //признак отсутствия файла с изображением
//Обработка события Create для формы
procedure TForm1.FormCreate(Sender: TObject);
begin
p_exit:=false;
try
//если файлы картинок не доступны, то при
//выполнении метода Create произойдет исключение
water:=TBitmap.Create;//создание объекта-битового образа
//Загрузка фона из файла
water.LoadFromFile('Вода.bmp');
fish:=TBitmap.Create; //создание объекта-битового образа
//Загрузка из файла изображения рыбки
fish.LoadFromFile('Рыбка.bmp');
except
MessageDlg('Файл с изображением отсутствует',
mtError,[mbOK],0);
p_exit:=true
end
end;
//Обработка события Paint
procedure TForm1.FormPaint(Sender: TObject);
var
x, y: integer;
begin
if p_exit then exit;
randomize;
//случайный выбор координат
x:=random(Form1.ClientWidth-Form1.ClientWidth div 3);
y:=random(Form1.ClientHeight-Form1.ClientHeight div 3);
//отрисовка фона - воды
Form1.Canvas.StretchDraw(Rect(0, 0, Form1.Width,
Form1.Height), water);
// в качестве прозрачного будет использован цвет,
// совпадающий с цветом левой нижней точки рисунка
fish.Transparent:=true; //разрешен прозрачный цвет
//отрисовка рыбки
Form1.Canvas.StretchDraw(Rect(x, y, x+Form1.ClientWidth
div 3, y+Form1.ClientHeight div 3), fish)
end;
//Обработка события Close
procedure TForm1.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
//освобождение памяти
water.Free;
fish.Free
end;
end.
Теперь рассмотрим пример реализации перемещения одного изо-
бражения на фоне другого: перемещение рыбки на фоне воды (оба
изображения – битовые образы). Эффект перемещения достигается
путем перерисовки изображения с некоторым смещением относитель-
но его прежнего положения. При этом перед выводом картинки в но-
вой точке предварительно необходимо удалить предыдущее изображе-
ние путем перерисовкой фона, причем рациональнее обновлять его
только в той области, которая до момента перерисовки содержала сти-
раемое изображение. Стереть картинку можно методом CopyRect, ко-
торым нужно осуществить копирование нужной части фона из буфера
на поверхность компонента. В примере изображение формируется на
поверхности формы, а компонент Timer служит для инициализации
процесса перерисовки рыбки в новом месте:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, ExtCtrls, StdCtrls,
XPMan, ColorGrd;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender:TObject; var Action:
TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
water: TBitmap; //фоновая картинка воды
fish: TBitmap; //картинка с рыбкой
p_exit: boolean; //признак отсутствия файла с изображением
x, y: integer; //текущее положение картинки
w, h: integer; //размеры картинки с рыбкой
//Обработка события Create для формы
procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
p_exit:=false;
Timer1.Interval:=100; //интервал времени для таймера
try
//если файлы картинок не доступны, то при
//выполнении метода Create произойдет исключение
water:=TBitmap.Create;//создание объекта-битового образа
//загрузка фона из файла
water.LoadFromFile('Вода.bmp');
//размер формы подгоняем под размер изображения с фоном
Form1.ClientHeight:=water.Height;
Form1.ClientWidth:=water.Width;
fish:=TBitmap.Create; //создание объекта-битового образа
//Загрузка из файла изображения рыбки
fish.LoadFromFile('Рыбка.bmp');
w:=Form1.ClientWidth div 3;//ширина картинки с рыбкой
h:=Form1.ClientHeight div 3; //высота картинки с рыбкой
fish.Transparent:=true; //разрешаем прозрачный цвет,
//определяемый левым нижним
//пикселем картинки
//начальное положение картинки
x:=Form1.ClientWidth;
y:=random(Form1.ClientHeight-h);
except
MessageDlg('Файл с изображением отсутствует', mtError,
[mbOK],0);
p_exit:=true;
Timer1.Enabled:=false //останавливаем таймер
end;
end;
//Обработка события Paint
procedure TForm1.FormPaint(Sender: TObject);
begin
if p_exit then exit;
//отрисовка фона - воды
Form1.Canvas.Draw(0, 0, water);
end;
//Обработка сигнала таймера
procedure TForm1.Timer1Timer(Sender: TObject);
begin
randomize;
if p_exit then exit;
//восстановлением фона удалим рисунок
Form1.Canvas.CopyRect(Rect(x, y, x+w, y+h), water.Canvas,
Rect(x, y, x+w, y+h));
//новые координаты вывода рыбки
x:=x-5;
if x<-w
then begin
x:=Form1.ClientWidth;
y:=random(Form1.ClientHeight-h);;
end;
//отрисовка рыбки в новом месте
Form1.Canvas.StretchDraw(Rect(x, y, x+w, y+h), fish)
end;
28
//Обработка события Close
procedure TForm1.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
//освобождение памяти
water.Free;
fish.Free;
end;
end.
В предыдущих двух примерах битовые образы загружались из
файлов. Но можно загружать их из ресурса. Ресурс – это данные, кото-
рые находятся в выполняемом файле. Чтобы загрузить битовый образ
из ресурса, необходимо:
1) создать файл ресурсов, поместив в него нужные изображения;
2) включить содержимое файла ресурсов в exe-файл, дав компи-
лятору соответствующее указание.
При использовании файла ресурсов все нужные для работы файлы
картинок находятся в исполняемом файле, поэтому не надо заботиться
о том, чтобы во время работы программы файлы картинок были дос-
тупны.
Чтобы создать новый файл ресурсов, надо воспользоваться утили-
той Tools/Image Editor. В меню File выбрать команду New/
Recourse File. После создания файла ресурсов в него надо помес-
тить необходимые ресурсы - битовые образы. Для этого из меню Resource
или из контекстного меню надо выбрать команду New/Bitmap
(рис. 1.6) и в появившемся окне Bitmap Properties (рис. 1.7) указать
размер и количество цветов создаваемого изображения.
Рис. 1.6. Добавление в файл ресурсов нового ресурса
Рис. 1.7. Диалоговое окно Bitmap Properties
После установок характеристик битового образа и нажатия на
кнопке ОК, в иерархическом списке Contents появится элемент
Bitmap1 (рис. 1.8), изображающий созданный ресурс. Сформирован-
ное средой имя ресурса (Bitmap1) следует изменить, выбрав в его кон-
текстном меню команду Rename.
Рис. 1.8. Файл ресурсов после добавления: а) ресурса Bitmap; б) двух ресурсов Bitmap и иконки приложения Icon
Приступить непосредственно к формированию изображения мож-
но, выполнив двойной щелчок мышью на нужном ресурсе, или выбрав
команду меню Resource/Edit. После этого можно приступить к соз-
данию нужной картинки, используя инструменты графического редак-
тора Image Editor, который предоставляет программисту стандартный
для подобных редакторов набор инструментов, используя которые
можно нарисовать нужную картинку. Если во время работы надо из-
менить масштаб отображения картинки, то для увеличения масштаба
следует выбрать команду меню View/Zoom In, а для уменьшения —
команду Zoom Out. Увидеть картинку в реальном масштабе можно,
выбрав команду меню View/Actual Size.
Если в файл ресурсов надо включить уже существующий файл
картинки (или ее часть), то ее содержимое надо скопировать в буфер
обмена, например, при помощи редактора Paint. При выделении копи-
руемой области необходимо следить за ее размером (Paint выводит
информацию о размере выделяемой области в строке состояния). За-
тем надо поместить картинку из буфера в Image Editor.
После добавления всех необходимых картинок в файл ресурса, ко-
мандой меню File/Save его необходимо сохранить в каталоге с раз-
рабатываемым проектом. Image Editor присваивает файлу ресурсов
расширение res.
После создания файла ресурсов его необходимо подключить к раз-
рабатываемому приложению. Для этого в текст программы необходи-
мо поместить директиву компилятора, информирующую его о необхо-
димости включения в exe-файл содержимого файла ресурсов. Эту ди-
рективу обычно помещают в начале текста модуля. В общем случае
директива имеет синтаксис:
{$R Имя_файла_ресурсов}
Загрузка битового образа из ресурса производится методом
LoadFromResourseName(), который имеет два параметра: идентифика-
тор программы и имя ресурса. В качестве идентификатора программы
используется глобальная переменная HInstance, а в качестве имени
ресурса – идентификатор ресурса, заданный во время создания ресур-
са. Например, инструкция:
water.LoadFromResourceName(HInstance, 'WATER');
загружает в битовый образ water картинку из ресурса WATER.
В предыдущем примере изменим источник, содержащий загру-
жаемый фон (воду) и перемещающийся объект (рыбку): вместо файлов
организуем загрузку изображений из файла ресурсов.
Листинг программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action:
TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{$R images.res} //подключить файл ресурсов
var
water: TBitmap; //фоновая картинка воды
fish: TBitmap; //картинка с рыбкой
x, y: integer; //текущее положение картинки
w, h: integer; //размеры картинки с рыбкой
//Обработка события Create для формы
procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
Timer1.Interval:=100; //интервал времени для таймера
//создаnm два объекта - битовых образа
water:=TBitmap.Create;
fish:=TBitmap.Create;
//загрузить битовые образы из файла ресурсов
water.LoadFromResourceName(HInstance, 'WATER');
fish.LoadFromResourceName(HInstance, 'FISH');
//размер формы подгоняем под размер изображения с фоном
Form1.ClientHeight:=water.Height;
Form1.ClientWidth:=water.Width;
fish.Transparent:=true; //разрешаем прозрачный цвет,
//определяемый левым нижним
//пикселем картинки
w:=Form1.ClientWidth div 3;//ширина картинки с рыбкой
h:=Form1.ClientHeight div 3; //высота картинки с рыбкой
//начальное положение картинки
x:=Form1.ClientWidth;
y:=random(Form1.ClientHeight-h);
end;
//Обработка события Paint
procedure TForm1.FormPaint(Sender: TObject);
begin
//отрисовка фона - воды
Form1.Canvas.Draw(0, 0, water);
end;
//Обработка сигнала таймера
procedure TForm1.Timer1Timer(Sender: TObject);
begin
randomize;
//восстановлением фона удалим рисунок
Form1.Canvas.CopyRect(Rect(x, y, x+w, y+h), water.Canvas,
Rect(x, y, x+w, y+h));
//новые координаты вывода рыбки
x:=x-5;
if x<-w
then begin
x:=Form1.ClientWidth;
y:=random(Form1.ClientHeight-h);;
end;
//отрисовка рыбки в новом месте
Form1.Canvas.StretchDraw(Rect(x, y, x+w, y+h), fish)
end;
//Обработка события Close
procedure TForm1.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
//освобождение памяти
water.Free;
fish.Free;
end;
end.
|