- •12.Списки
- •Interface
- •Implementation
- •13.Модули
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •14.Таблицы
- •Interface
- •Implementation
- •15.Графика, отображение графиков функций
- •Interface
- •Implementation
- •Initialization
- •16.Графика, примитивы
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Initialization
- •17.Графика, растровые изображения и анимация
- •Interface
- •Implementation
- •Initialization
- •Interface
- •Implementation
- •18.Тестирование и отладка
- •19.Квадратное уравнение
- •Interface
- •20.Класс tThread
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •21.Класс tStream
- •Interface
- •Implementation
- •Initialization
- •Interface
- •Implementation
- •Initialization
- •22.Создание в Delphi кроссплатформенного приложения
Interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls,
StdCtrls, Buttons;
type
TForm1 = class(TForm)
Timer1: TTimer;
Image1: TImage;
procedure FormActivate(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
Back, Bitmap, Buf : TBitMap; // Фон, картинка, буфер
BackRct : TRect; // Область фона, восстановлена из буфера
BufRct: Trect; // Область буфера для фона
x,y:integer; // Текущее положение картинки
W,H: integer; // Размеры картинки
procedure TForm1.FormActivate(Sender: TObject);
begin
// создать три объекта - битовых образа
Back := TBitmap.Create; // Фон
Bitmap := TBitmap.Create; // Картинка
Buf := TBitmap.Create; // Буфер
// загрузить и вывести фон
Back.LoadFromFile('factory.bmp');
Form1.Image1.canvas.Draw(0,0,Back);
// загрузить картинку, которая будет двигаться
Bitmap.LoadFromFile('aplane.bmp');
// определим "прозрачный" цвет
Bitmap.Transparent := True;
Bitmap.TransParentColor := Bitmap.canvas.pixels[1,1];
// создать буфер для копии области фона под картинку
W:= Bitmap.Width;
H:= Bitmap.Height;
Buf.Width:= W;
Buf.Height:=H;
Buf.Palette:=Back.Palette; // Для соответствия палитр !!
Buf.Canvas.CopyMode:=cmSrcCopy;
// определим область буфера для восстановления фона
BufRct:=Bounds(0,0,W,H);
// начальное положение картинки
x := -W;
y := 20;
// определим сохраняемую область фона и сохраним ее
BackRct:=Bounds(x,y,W,H);
Buf.Canvas.CopyRect(BufRct,Back.Canvas,BackRct);
end;
procedure TForm1.Timer1Timer(Sender: TObject); // обработка сигнала таймера
begin
Form1.image1.canvas.Draw(x,y,Buf); // Удалим рисунок
x:=x+2;
if x>form1.Image1.Width then x:=-W;
// определим сохраняемую область фона и сохраним ее копию
BackRct:=Bounds(x,y,W,H);
Buf.Canvas.CopyRect(BufRct,Back.Canvas,BackRct);
// выведем рисунок
Form1.image1.canvas.Draw(x,y,bitmap);
end;
// завершение работы программы
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// освободим память, выделенную для хранения битовых образов
Back.Free;
Bitmap.Free;
Buf.Free;
end;
end.
На рис. 17 .22представлен вид кадра окна приложения при исполнении. Самолет движется слева направо.
рис. 17.22. Окно работающего приложения задачи 2
Выводы
Для работы с изображениями класса TBitmap предназначен компонент TImage.
ИСР содержит класс TJpegImage для работы со сжатыми по стандарту Jpeg изображениями.
Для фотореалистических изображений возможно сжатие в десятки раз без заметного ухудшения качества.
При создании анимации образ движущегося объекта рисуется на холсте со смещением во времени. Перед очередным рисованием область фона, на которую накладывается текущий образ движущегося объекта, запоминается в буфере для последующего восстановления.