Копия викизеркало

Это зеркало вики с pascal.chat. Правка, история и вход — там.

BGRABitmap tutorial 2/ru

Deutsch · English · Español · Français · Русский

Из этого урока Вы узнаете, как загрузить изображение и нарисовать его на форме.

Создаём новый проект

Создайте новый проект и добавьте ссылку на модуль BGRABitmap, так же, как в первом уроке.

Загружаем растровое изображение (bitmap)

Скопируйте изображение в каталог вашего проекта. Предположим, имя файла image.png.

Добавьте переменную "image" в "private" область основной формы для хранения изображения:

pascal
  TForm1 = class(TForm)
  private
    { private declarations }
    image: TBGRABitmap;
  public
    { public declarations }
  end;

Загрузите изображение при создании формы. Для этого дважды щелкните форму, в редакторе кода должна появиться процедура. И добавьте инструкцию загрузки изображения из файла в переменную "image":

pascal
procedure TForm1.FormCreate(Sender: TObject);
begin
  image := TBGRABitmap.Create('image.png');
end;

Нарисуем растровое изображение (bitmap)

Добавьте обработчик OnPaint. Для этого выберите основную форму, затем перейдите в инспектор объектов на вкладке событий и дважды щелкните строку OnPaint. Затем добавьте код для рисования:

pascal
procedure TForm1.FormPaint(Sender: TObject);
begin
  image.Draw(Canvas,0,0,True);
end;

Обратите внимание, что последний параметр имеет значение True, что означает непрозрачность. Если вы хотите принять во внимание прозрачные пиксели, закодированные в альфа-канале, вы должны использовать вместо этого False. Однако использование прозрачного рисунка на стандартном холсте может быть медленным, поэтому, если в этом нет необходимости, используйте только непрозрачный рисунок.

Весь код

pascal
unit UMain;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  BGRABitmap, BGRABitmapTypes;

type
  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { private declarations }
    image: TBGRABitmap;
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  image := TBGRABitmap.Create('image.png');
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  image.Draw(Canvas,0,0,True);
end;

initialization
  {$I UMain.lrs}

end.

Запустим программу

Вы должны увидеть форму с изображением в верхнем левом углу.

Сделаем выравнивание по центру изображения

Вы можете центрировать изображение в форме. Для этого измените процедуру FormPaint:

pascal
procedure TForm1.FormPaint(Sender: TObject);
var ImagePos: TPoint;
begin
  ImagePos := Point( (ClientWidth - Image.Width) div 2,
                     (ClientHeight - Image.Height) div 2 );

  // test for negative position
  if ImagePos.X < 0 then ImagePos.X := 0;
  if ImagePos.Y < 0 then ImagePos.Y := 0;

  image.Draw(Canvas,ImagePos.X,ImagePos.Y,True);
end;

Чтобы вычислить позицию, нам нужно вычислить пространство между изображением и левой границей (координата X) и пространство между изображением и верхней границей (координата Y). Выражение ClientWidth - Image.Width возвращает доступное горизонтальное пространство, и мы делим его на 2, чтобы получить левое поле.

Результат может быть отрицательным, если изображение больше ширины клиента. В этом случае отступ от края устанавливается на ноль.

Вы можете запустить программу и посмотреть, работает ли она. Обратите внимание, что произойдет, если мы удалим проверку на отрицательную позицию изображения относительно края.

Растянем изображение

Чтобы растянуть изображение, нам нужно создать временное растянутое изображение:

pascal
procedure TForm1.FormPaint(Sender: TObject);
var stretched: TBGRABitmap;
begin
  stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;
  stretched.Draw(Canvas,0,0,True);
  stretched.Free;
end;

По умолчанию используется точное копирование. Но вместо этого Вы можете использовать простое растяжение (работает быстрее):

pascal
stretched := image.Resample(ClientWidth, ClientHeight, rmSimpleStretch) as TBGRABitmap;

Вы также можете указать интерполяционный фильтр с помощью свойства ResampleFilter:

pascal
image.ResampleFilter := rfMitchell;
stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;

Первый урок | Следующий урок (Рисование с помощью мыши (No. 3))


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.

Версия 2, последнее изменение: WikiArchive, .