Sign in Join
Wiki copytemporary

BGRABitmap tutorial 2/ru: what changed

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

OldNewLine
11Из этого урока Вы узнаете, как загрузить изображение и нарисовать его на форме.
22
33### Создаём новый проект
44
55Создайте новый проект и добавьте ссылку на модуль [[BGRABitmap]], так же, как в [[BGRABitmap tutorial 1/ru|первом уроке]].
66
77### Загружаем растровое изображение (bitmap)
88
99Скопируйте изображение в каталог вашего проекта. Предположим, имя файла *image.png*.
1010
1111Добавьте переменную "image" в "private" область основной формы для хранения изображения:
1212
1313``` pascal
1414 TForm1 = class(TForm)
1515 private
1616 { private declarations }
1717 image: TBGRABitmap;
1818 public
1919 { public declarations }
2020 end;
2121```
2222
2323Загрузите изображение при создании формы. Для этого дважды щелкните форму, в редакторе кода должна появиться процедура. И добавьте [[TBGRACustomBitmap and IBGRAScanner|инструкцию загрузки изображения из файла]] в переменную "image":
2424
2525``` pascal
2626procedure TForm1.FormCreate(Sender: TObject);
2727begin
2828 image := TBGRABitmap.Create('image.png');
2929end;
3030```
3131
3232### Нарисуем растровое изображение (bitmap)
3333
3434Добавьте обработчик OnPaint. Для этого выберите основную форму, затем перейдите в инспектор объектов на вкладке событий и дважды щелкните строку OnPaint. Затем добавьте код для рисования:
3535
3636``` pascal
3737procedure TForm1.FormPaint(Sender: TObject);
3838begin
3939 image.Draw(Canvas,0,0,True);
4040end;
4141```
4242
4343Обратите внимание, что последний параметр имеет значение True, что означает непрозрачность. Если вы хотите принять во внимание прозрачные пиксели, закодированные в альфа-канале, вы должны использовать вместо этого False. Однако использование прозрачного рисунка на стандартном холсте может быть медленным, поэтому, если в этом нет необходимости, используйте только непрозрачный рисунок.
4444
4545### Весь код
4646
4747``` pascal
4848unit UMain;
4949
5050{$mode objfpc}{$H+}
5151
5252interface
5353
5454uses
5555 Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
5656 BGRABitmap, BGRABitmapTypes;
5757
5858type
5959 { TForm1 }
6060
6161 TForm1 = class(TForm)
6262 procedure FormCreate(Sender: TObject);
6363 procedure FormPaint(Sender: TObject);
6464 private
6565 { private declarations }
6666 image: TBGRABitmap;
6767 public
6868 { public declarations }
6969 end;
7070
7171var
7272 Form1: TForm1;
7373
7474implementation
7575
7676{ TForm1 }
7777
7878procedure TForm1.FormCreate(Sender: TObject);
7979begin
8080 image := TBGRABitmap.Create('image.png');
8181end;
8282
8383procedure TForm1.FormPaint(Sender: TObject);
8484begin
8585 image.Draw(Canvas,0,0,True);
8686end;
8787
8888initialization
8989 {$I UMain.lrs}
9090
9191end.
9292```
9393
9494### Запустим программу
9595
9696Вы должны увидеть форму с изображением в верхнем левом углу.
9797
98-<figure>
99-<img src="BGRATutorial2.png" title="BGRATutorial2.png" />
100-<figcaption>BGRATutorial2.png</figcaption>
101-</figure>
98+![](/wiki-images/d/db/BGRATutorial2.png)
10299
103100### Сделаем выравнивание по центру изображения
104101
105102Вы можете центрировать изображение в форме. Для этого измените процедуру FormPaint:
106103
107104``` pascal
108105procedure TForm1.FormPaint(Sender: TObject);
109106var ImagePos: TPoint;
110107begin
111108 ImagePos := Point( (ClientWidth - Image.Width) div 2,
112109 (ClientHeight - Image.Height) div 2 );
113110
114111 // test for negative position
115112 if ImagePos.X < 0 then ImagePos.X := 0;
116113 if ImagePos.Y < 0 then ImagePos.Y := 0;
117114
118115 image.Draw(Canvas,ImagePos.X,ImagePos.Y,True);
119116end;
120117```
121118
122119Чтобы вычислить позицию, нам нужно вычислить пространство между изображением и левой границей (координата X) и пространство между изображением и верхней границей (координата Y). Выражение ClientWidth - Image.Width возвращает доступное горизонтальное пространство, и мы делим его на 2, чтобы получить левое поле.
123120
124121Результат может быть отрицательным, если изображение больше ширины клиента. В этом случае отступ от края устанавливается на ноль.
125122
126123Вы можете запустить программу и посмотреть, работает ли она. Обратите внимание, что произойдет, если мы удалим проверку на отрицательную позицию изображения относительно края.
127124
128125### Растянем изображение
129126
130127Чтобы растянуть изображение, нам нужно создать временное растянутое изображение:
131128
132129``` pascal
133130procedure TForm1.FormPaint(Sender: TObject);
134131var stretched: TBGRABitmap;
135132begin
136133 stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;
137134 stretched.Draw(Canvas,0,0,True);
138135 stretched.Free;
139136end;
140137```
141138
142139По умолчанию используется точное копирование. Но вместо этого Вы можете использовать простое растяжение (работает быстрее):
143140
144141``` pascal
145142stretched := image.Resample(ClientWidth, ClientHeight, rmSimpleStretch) as TBGRABitmap;
146143```
147144
148145Вы также можете указать интерполяционный фильтр с помощью свойства [[TBGRACustomBitmap and IBGRAScanner|ResampleFilter]]:
149146
150147``` pascal
151148image.ResampleFilter := rfMitchell;
152149stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;
153150```
154151
155152[[BGRABitmap tutorial 1/ru|Первый урок]] \| [[BGRABitmap tutorial 3|Следующий урок (Рисование с помощью мыши (No. 3))]]
156153
157154---
158155*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