Sign in Join
Wiki copytemporary

BGRABitmap tutorial 2/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: BGRABitmap tutorial 2/ru

OldNewLine
1+Из этого урока Вы узнаете, как загрузить изображение и нарисовать его на форме.
2+
3+### Создаём новый проект
4+
5+Создайте новый проект и добавьте ссылку на модуль [[BGRABitmap]], так же, как в [[BGRABitmap tutorial 1/ru|первом уроке]].
6+
7+### Загружаем растровое изображение (bitmap)
8+
9+Скопируйте изображение в каталог вашего проекта. Предположим, имя файла *image.png*.
10+
11+Добавьте переменную "image" в "private" область основной формы для хранения изображения:
12+
13+``` pascal
14+ TForm1 = class(TForm)
15+ private
16+ { private declarations }
17+ image: TBGRABitmap;
18+ public
19+ { public declarations }
20+ end;
21+```
22+
23+Загрузите изображение при создании формы. Для этого дважды щелкните форму, в редакторе кода должна появиться процедура. И добавьте [[TBGRACustomBitmap and IBGRAScanner|инструкцию загрузки изображения из файла]] в переменную "image":
24+
25+``` pascal
26+procedure TForm1.FormCreate(Sender: TObject);
27+begin
28+ image := TBGRABitmap.Create('image.png');
29+end;
30+```
31+
32+### Нарисуем растровое изображение (bitmap)
33+
34+Добавьте обработчик OnPaint. Для этого выберите основную форму, затем перейдите в инспектор объектов на вкладке событий и дважды щелкните строку OnPaint. Затем добавьте код для рисования:
35+
36+``` pascal
37+procedure TForm1.FormPaint(Sender: TObject);
38+begin
39+ image.Draw(Canvas,0,0,True);
40+end;
41+```
42+
43+Обратите внимание, что последний параметр имеет значение True, что означает непрозрачность. Если вы хотите принять во внимание прозрачные пиксели, закодированные в альфа-канале, вы должны использовать вместо этого False. Однако использование прозрачного рисунка на стандартном холсте может быть медленным, поэтому, если в этом нет необходимости, используйте только непрозрачный рисунок.
44+
45+### Весь код
46+
47+``` pascal
48+unit UMain;
49+
50+{$mode objfpc}{$H+}
51+
52+interface
53+
54+uses
55+ Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
56+ BGRABitmap, BGRABitmapTypes;
57+
58+type
59+ { TForm1 }
60+
61+ TForm1 = class(TForm)
62+ procedure FormCreate(Sender: TObject);
63+ procedure FormPaint(Sender: TObject);
64+ private
65+ { private declarations }
66+ image: TBGRABitmap;
67+ public
68+ { public declarations }
69+ end;
70+
71+var
72+ Form1: TForm1;
73+
74+implementation
75+
76+{ TForm1 }
77+
78+procedure TForm1.FormCreate(Sender: TObject);
79+begin
80+ image := TBGRABitmap.Create('image.png');
81+end;
82+
83+procedure TForm1.FormPaint(Sender: TObject);
84+begin
85+ image.Draw(Canvas,0,0,True);
86+end;
87+
88+initialization
89+ {$I UMain.lrs}
90+
91+end.
92+```
93+
94+### Запустим программу
95+
96+Вы должны увидеть форму с изображением в верхнем левом углу.
97+
98+<figure>
99+<img src="BGRATutorial2.png" title="BGRATutorial2.png" />
100+<figcaption>BGRATutorial2.png</figcaption>
101+</figure>
102+
103+### Сделаем выравнивание по центру изображения
104+
105+Вы можете центрировать изображение в форме. Для этого измените процедуру FormPaint:
106+
107+``` pascal
108+procedure TForm1.FormPaint(Sender: TObject);
109+var ImagePos: TPoint;
110+begin
111+ ImagePos := Point( (ClientWidth - Image.Width) div 2,
112+ (ClientHeight - Image.Height) div 2 );
113+
114+ // test for negative position
115+ if ImagePos.X < 0 then ImagePos.X := 0;
116+ if ImagePos.Y < 0 then ImagePos.Y := 0;
117+
118+ image.Draw(Canvas,ImagePos.X,ImagePos.Y,True);
119+end;
120+```
121+
122+Чтобы вычислить позицию, нам нужно вычислить пространство между изображением и левой границей (координата X) и пространство между изображением и верхней границей (координата Y). Выражение ClientWidth - Image.Width возвращает доступное горизонтальное пространство, и мы делим его на 2, чтобы получить левое поле.
123+
124+Результат может быть отрицательным, если изображение больше ширины клиента. В этом случае отступ от края устанавливается на ноль.
125+
126+Вы можете запустить программу и посмотреть, работает ли она. Обратите внимание, что произойдет, если мы удалим проверку на отрицательную позицию изображения относительно края.
127+
128+### Растянем изображение
129+
130+Чтобы растянуть изображение, нам нужно создать временное растянутое изображение:
131+
132+``` pascal
133+procedure TForm1.FormPaint(Sender: TObject);
134+var stretched: TBGRABitmap;
135+begin
136+ stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;
137+ stretched.Draw(Canvas,0,0,True);
138+ stretched.Free;
139+end;
140+```
141+
142+По умолчанию используется точное копирование. Но вместо этого Вы можете использовать простое растяжение (работает быстрее):
143+
144+``` pascal
145+stretched := image.Resample(ClientWidth, ClientHeight, rmSimpleStretch) as TBGRABitmap;
146+```
147+
148+Вы также можете указать интерполяционный фильтр с помощью свойства [[TBGRACustomBitmap and IBGRAScanner|ResampleFilter]]:
149+
150+``` pascal
151+image.ResampleFilter := rfMitchell;
152+stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;
153+```
154+
155+[[BGRABitmap tutorial 1/ru|Первый урок]] \| [[BGRABitmap tutorial 3|Следующий урок (Рисование с помощью мыши (No. 3))]]
156+
157+---
158+*From the Free Pascal wiki, page "BGRABitmap tutorial 2/ru", as it stood on 2020-02-10 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history