Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ИнфТехнКомпТехн

.pdf
Скачиваний:
18
Добавлен:
02.04.2015
Размер:
35.33 Mб
Скачать

Рисунок 17.3 – Окно выбора цвета

Вернуться в режим конструирования.

Двойным щелчком по компонентам создать заготовки методов для отклика на событие OnChange (на изменение) для каждой из полос прокрутки ScrollBar1

и ScrollBar2.

Написать для этих методов коды, которые установят свойство Width (ширина) или Height (высота) фигуры Shape1 в соответствии с положением "бегунка" на горизонтальной (ScrollBar1) или вертикальной (ScrollBar2) полосах прокрутки.

16.Подобрать соотношение между положением бегунков полосы прокрутки

ScrollBar1.Position и ScrollBar2.Position (лежат в пределах 1...100) и размерами фигуры, при котором достигается лучшее представление изменения размеров фигуры.

17.Запустить проект и проверить действие каждой из полос прокрутки. Вернуться в режим конструирования.

18.Для выбора нового вида фигуры использовать выпадающий список (ComboBox). Чтобы создать список в режиме проектирования, необходимо ввести нужные элементы в список Items, щелкнув маленькую кнопку с тремя точками в правой части строки Инспектора объектов, отображающую данное свойство. Список показан на Рис. 17.4.

231

Рисунок 17.4 - Список опций свойства Shape

19.В диалоговое окно текстового редактора (см. Рис. 74) ввести фигуры по заданию.

20.Двойным щелчком по компоненту ComboBox1 создать заготовку обработчика события OnClick (на щелчок) для списка ComboBox1. В нее вставить код, позволяющий выбрать из списка нужный элемент.

21.Для проверки кода запустить проект, а затем поочередно выбрать из списка разные виды фигур.

22.Сохранить и закрыть проект. Запустить исполняемый файл проекта Prg_16_2 из среды Windows и проверить его работоспособность.

Листинг модуля формы unit Prg_16_2_; interface uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;

type

TForm1 = class(TForm) FormColor: TButton; ShapeColor: TButton; ScrollBar1: TScrollBar; ComboBox1: TComboBox; Shape1: TShape; ColorDialog1: TColorDialog; ScrollBar2: TScrollBar; Panel1:

TPanel;

 

 

 

 

procedure FormColorClick(Sender: TObject);

с помощью

16.

Запрограммировать

изменение размера фигуры

полос прокрутки. Для этого:

TObject);

procedure

procedure

ShapeColorClick(Sender:

ScrollBar1Change(Sender:

TObject);

procedure

ScrollBar2Change(Sender:

TObject);

procedure

ComboBox1Click(Sender: TObject); private

 

 

{Private declarations } public

{Public declarations } end;

var

Form1: TForm1; implementation {$R *.DFM}

procedure TForm1.FormColorClick(Sender: TObject); begin

if ColorDialog1.Execute then Form1.Color:= ColorDialog1.Color; end;

232

procedure TForm1.ShapeColorClick(Sender: TObject); begin

if ColorDialog1.Execute then Shape1.Brush.Color:= ColorDialog1.Color;

end;

procedure TForm1.ScrollBar1Change(Sender: TObject); begin

Shape1.Width:= ScrollBar1.Position*3; end;

procedure TForm1.ScrollBar2Change(Sender: TObject); begin

Shape1.Height:= ScrollBar2.Position*3; end;

procedure TForm1.ComboBox1Click(Sender: TObject); var

Index: integer; begin

if ComboBox1.Text='stRectangle' then Index:=0; if ComboBox1.Text='stSquare' then Index:=1; if ComboBox1.Text='stRoundRect' then Index:=2;

if ComboBox1.Text='stRoundSquare' then Index:=3;

if ComboBox1.Text='stEllipse' then Index:=4; if ComboBox1.Text='stCircle' then Index:=5; Shape1.Shape:=TShapeType(Index);

end;

end.

Задание 3

Создать проект работы с метафайлом. Метафайл содержит график с двумя фигурами (эллипс и квадрат), создается программно, отображается на форме и сохраняется на диске ПК. Для проверки праильности метафайла он считывается в компонент Image формы. Проект – приложение.

На Рис. 17.5 показана форма проекта задачи 3. Она содержит компонент Image1 для просмотра метафайла и две кнопки:

Button1 - «Создать метафайл». При нажатии кнопки метафайл MyMetafile.wmf создается, проРисовывается на форме и сохраняется на диске.

Button2 - «Смотреть метафайл». Нажатие этой кнопки приводит к отображению метафайла в компоненте Image1 формы.

233

Рисунок 17.5 - Показана форма проекта задачи 3

Листинг модуля формы unit Prg_16_3_; interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm) Sozdath: TButton; Image1: TImage; Smotreth: TButton;

procedure SozdathClick(Sender: TObject); procedure SmotrethClick(Sender: TObject); private

{Private declarations } public

{Public declarations } end;

var

Form1: TForm1; MyMetafile:TMetafile; implementation

{$R *.dfm}

procedure TForm1. SozdathClick(Sender: TObject); begin

with TMetafileCanvas.Create(MyMetafile, 0) do try Brush.Color := clRed;

Ellipse(0,0,150,100);// Рисуем эллипс Brush.Color:=clWhite;

Rectangle(150,150,200,200);

// Рисуем квадрат

 

finally

 

 

Free

 

 

end;

 

Сохранить

MyMetafile.SaveToFile('MyMetafile.wmf'); //

метафайл

 

метафайл на

Form1.Canvas.Draw(0,0,MyMetafile); // Рисовать

форме

 

 

 

234

 

end;

procedure TForm1. SmotrethClick(Sender: TObject); begin

Image1.Picture.LoadFromFile('MyMetafile.wmf'); // Просмотр метафайла

end; initialization

MyMetafile := TMetafile.Create;// Создать метафайл end.

Внимание

Работа с метафайлом осуществляется в динамической памяти, поэтому перед использованием созданного метафайла необходимо освободить ДП процедурой Free.

На Рис. 17.6 показано окно работающего приложения задачи 3. Левая часть отображается при нажатии кнопки «Создать метафайл», правая – при нажатии кнопки «Смотреть метафайл».

Выводы

1.Для построения графиков используются графические примитвы.

2.Определены графические примитивы:

Линия и метод LineTo его отображения.

Кусочно-ломаная линия и метод PolyLine и его отображения.

Хорда (линия поперек эллипса) и метод Chord его отображения.

Прямоугольная рамка и метод FrameRect его отображения.

Заполненный прямоугольник и метод Rectangle его отображения.

Заполненный многоугольник и метод Polygon его отображения.

Заполненный прямоугольник со скругленными углами и метод RoundRect его отображения.

Дуга и метод Arc его отображения.

Заполненный эллипс и метод Ellipse его отображения.

Пирог (сектор эллипса) и метод Pie его отображения.

3.Определен метод заполнения замкнутых фигур FloodFill (заполнить область),

4.Имеется метод вывода текста: TextOut (вставить строку текста).

5.Определен компонент TShape (фигура)., позволяющий быстро выбирать фигуру для построения.

6.Для изменения интерфейса используются кнопки, линейки прокрутки, списки, меню, диалоги.

7.Замкнутые фигуры с помощью инструмента Brush могут быть залиты узором.

8.График с использованием примитивов может быть сохранен в формате метафайла

Windows.

18. Графика, растровые изображения и анимация

Подготовка к работе

1.По рекомендованной литературе изучить графические средства Delphi.

2.Разработать алгоритмы решения задач.

3.Составить программы решения задач.

4.Контрольные вопросы

5.Класс TImage - компонент изображения.

6.Класс TBitMap - растровое изображение.

7.Класс TJpegImage - сжатое по стандарту Jpeg изображение.

235

8.Сжатие изображений в стандарте Jpeg за счет изменения системы цветов..

9.Сжатие изображений в стандарте Jpeg за счет дискретного косинусного преобразования.

10.Сжатие изображений в стандарте Jpeg за счет обнаружения повторяющихся кодов.

11.Сжатие изображений в стандарте Jpeg за счет использования алгоритма Хафмена.

12.Компонент TrackBar и его использование.

13.Использование класса TMemoryStream для определения размеров файлов.

14.Принцип создания анимации.

15.Использование в анимационной программе фоновой картинки.

16.Использование в анимационной программе картинки образа.

17.Использование в анимационной программе буфера.

Задание к работе

1.Создать программу обработки битовых изображений. Проект – приложение. Нужно использовать два компонента TImage, в одном отображается растровая картинка, в другом - она же с использованием алгоритмов сжатия. Для сжатия использовать класс TJpegImage.

2.Создать программу анимации (движение самолета на фоне изображения фабрики) в компоненте TImage. Проект –приложение. Пример выполнения Задание 1

3.Создать программу работы с графическими файлами, Проект – приложение. В программе используется файл растровой картинки picture.bmp, который надо загрузить в ту же папку, где находится проект приложения. Этот файл находится в папке УМД к ЛР.

Вформе размещены:

Компоненты Image1 и Image2 для отображения битовых образов.

Кнопки Button1 (BitMap) и Button2 (JpegImage), нажатие которых приводит к проРисовке изображений.

Метки Label1 и Label2 для вывода размеров файлов исходного и сжатого изображений.

Регулятор TrackBar1 для изменения качества сжимаемого изображения.

Метки Label3, Label4 и Label5 для отображения минимального, максимального и текущего значения коэффициента качества. Диапазон этого коэффициента определен в пределах 1...100.

Метка Label6 предназначена для заголовка компонент регулятора. Программа содержит 3 процедуры. Две отрабатывают нажатие кнопок, третья

изменение состояния регультора.

В программе используется класс TJpegImage, описанный в ИСР в модуле Jpeg. Поэтому в строке uses нужно добавить ссылку на этот модуль. В программе определены:

переменные MyBitmap и MyJpeg для взаимных преобразований картинок.

переменная MyMemory для создания буфера в памяти, по нему определяются размеры файлов в байтах.

вспомогательные переменные.

файлы картинок должны размещаться в папке проекта.

Листинг модуля формы unit Prg_17_1_; interface uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, jpeg, ComCtrls;

type

236

TForm1 = class(TForm) Image1: TImage; Image2: TImage; BitBtn1:

TBitBtn;

BitBtn2: TBitBtn;

Label1:

TLabel; Label2: TLabel;

TrackBar1: TTrackBar; Label3: TLabel; Label4: TLabel; Label5:

TLabel; Label6: TLabel;

 

TObject);

procedure

procedure

BitBtn1Click(Sender:

BitBtn2Click(Sender:

TObject);

procedure

TrackBar1Change(Sender: TObject); private

 

{Private declarations } public

{Public declarations } end;

var

Form1: TForm1; MyJpeg:TJpegImage; MyBitMap:TBitmap; MyMemory:TmemoryStream; s1,s2,s3,s:string; size:integer; implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);

begin Image1.Picture.Assign(MyBitmap); MyMemory.Clear; Mymemory.LoadFromFile(s1); str(MyMemory.Size,s3); Label1.Caption:=s3;

end;

procedure TForm1.BitBtn2Click(Sender: TObject);

begin MyJpeg.Assign(MyBitmap); MyJpeg.CompressionQuality:=100; MyJpeg.Compress; MyJpeg.SaveToFile(s2); Image2.Picture.LoadFromFile(s2); MyMemory.Clear; Mymemory.LoadFromFile(s2); str(MyMemory.Size,s3); Label2.Caption:=s3;

end;

procedure TForm1.TrackBar1Change(Sender: TObject);

begin str(TrackBar1.Min,s3); Label3.Caption:=s3; str(TrackBar1.Max,s3); Label4.Caption:=s3; str(TrackBar1.Position,s3); Label5.Caption:=s3; MyJpeg.CompressionQuality:=TrackBar1.Position; MyJpeg.Compress;

MyJpeg.SaveToFile(s2);

Image2.Picture.LoadFromFile(s2);MyMemory.Clear;

Mymemory.LoadFromFile(s2);str(MyMemory.Size,s3);

Label2.Caption:=s3;end; initialization

s1:='E:\Eddy\Umd\Prg_YVU\LR\Delphi_examples_2\17_1\Picture.bmp '; s2:='E:\Eddy\Umd\Prg_YVU\LR\Delphi_examples_2\17_1\Picture.jpe g'; MyBitmap:=TBitMap.Create;

MyBitmap.LoadFromFile(s1);

MyMemory:=TmemoryStream.Create;

MyJpeg:=TJpegImage.Create;

end.

При запуске проекта на выполнение появляется окно в котором картинок нет. При

нажатии на кнопку BitMap отображается исходная картинка и размер ее файла (в примере 309862), При нажатии на кнопку JpegImage отображается сжатая картинка и размер ее файла (в примере 89598). Это показано на Рис. 18.1. Картинки получены при качестве 100,

237

когда никаких отличий не видно, хотя сжатый файл имеет размер примерно в 3 раза меньше.

Если теперь перемещать движок регулятора, сжатая картинка и размер ее файла динамически изменяются. Например, при коэффициенте качества 1 картинки имеют вид, показанный на Рис. 17.3. Размер сжатого файла 3119, т.е произошло сжатие примерно в 100 раз Граница заметности ухудшение качества для использованной картинки - коэффициент качества

При этом размер сжатого файла 5599, что примерно в 55 раз меньше, чем у исходного изображения.

Рисунок 18.1 - Картинки получены при качестве 100

Задание 2

Создать программу демонстрации анимации: движение самолета на фоне фабрики. Проект – приложение. В программе используются два файла растровых картинок, которые надо загрузить в ту же папку, где находится проект приложения:

фон - фабрика, файл factory.bmp,

движущийся объект - самолет, файл aplane.bmp. Эти файлы находятся в папке УМД к ЛР.

Листинг модуля формы unit prg_17_2_; 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);

238

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

239

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.

На Рис. 18.2 представлен вид кадра окна приложения при исполнении. Самолет движется слева направо.

Рисунок 18.2 - Кадра окна приложения при исполнении

Выводы

1.Для работы с изображениями класса TBitmap предназначен компонент TImage.

2.ИСР содержит класс TJpegImage для работы со сжатыми по стандарту Jpeg изображениями.

3.Для фотореалистических изображений возможно сжатие в десятки раз без заметного ухудшения качества.

4.При создании анимации образ движущегося объекта Рисуется на холсте со смещением во времени. Перед очередным Рисованием область фона, на которую накладывается текущий образ движущегося объекта, запоминается в буфере для последующего восстановления.

240