gpt4 book ai didi

delphi - 在 Canvas 上绘制旋转位图

转载 作者:行者123 更新时间:2023-12-02 22:24:20 24 4
gpt4 key购买 nike

我需要在另一个位图的 Canvas (主位图)上绘制旋转位图。但我不知道怎么办。

我尝试使用 TBitMap.Rotate 方法旋转位图,然后使用 TCanvas.DrawBitmap 方法将其绘制在主 BitMap 上,但这需要很多时间(我需要以不同角度绘制约 100 个相同的位图):

  1. 调整 BMP 大小
  2. 旋转 BMP
  3. 在另一 block Canvas 上绘画

如何立即绘制旋转位图而不需要 1 和 2 步骤?

示例:

var
Form1: TForm1;
MainBMP: TBitMap;
SomeItem: TBitMap;
buffBMP: TBitMap;

implementation

{$R *.fmx}


procedure TForm1.FormCreate(Sender: TObject);
begin
MainBMP := TBitMap.Create;
MainBMP.SetSize(screen.Width, screen.Height);
SomeItem := TBitMap.Create;
SomeItem.SetSize(50, 50);
with SomeItem.Canvas do
begin
BeginScene;
FillRect(rectF(0, 0, 50, 50), 5, 20, allCorners, 1);
EndScene;
end;
buffBMP := TBitMap.Create;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
rect, sizeRect: TRectF;
begin
MainBMP.Canvas.BeginScene;
MainBMP.Canvas.Clear($FF777777);
for i := 1 to 10000 do
begin
buffBMP.Assign(SomeItem);
buffBMP.Rotate(random(360));
sizeRect := rectF(0, 0, buffBMP.Width, buffBMP.Height);
rect := sizeRect;
rect.Offset(random(1200), random(600));
MainBMP.Canvas.DrawBitmap(buffBMP, sizeRect, rect, 1);
end;
MainBMP.Canvas.EndScene;
Form1.Canvas.BeginScene;
Form1.Canvas.DrawBitmap(MainBMP, ClientRect, ClientRect, 1);
Form1.Canvas.EndScene;
end;

没有

buffBMP.Rotate(random(360));

需要 16-32 毫秒。使用此方法:~8500 ms

我正在寻找类似的方法

TCanvas.DrawBitmap(const ABitmap: TBitmap; const SrcRect, DstRect: TRectF; const AOpacity: Single; const HighSpeed: Boolean);

但添加了角度:单个参数

安卓。 FMX。

谢谢。

最佳答案

您应该在位图上使用转换Matrix而不是Rotate方法。

这可能看起来像:

procedure TForm1.Timer1Timer(Sender: TObject);
var
I: Integer;
R: TRectF;
SaveMatrix: TMatrix;
Matrix: TMatrix;
begin
MainBMP.Canvas.BeginScene;
MainBMP.Canvas.Clear($FF777777);
SaveMatrix := MainBmp.Canvas.Matrix;
for I := 1 to 1000 do
begin
BuffBMP.Assign(SomeItem);
R := RectF(0, 0, BuffBMP.Width, BuffBMP.Height);
Matrix := CreateRotationMatrix(DegToRad(Random(360)));
Matrix.m31 := Random(1200);
Matrix.m32 := Random(600);
MainBMP.Canvas.SetMatrix(Matrix);
MainBMP.Canvas.DrawBitmap(buffBMP, R, R, 1, True);
end;
MainBMP.Canvas.SetMatrix(SaveMatrix);
MainBMP.Canvas.EndScene;
Canvas.BeginScene;
Canvas.DrawBitmap(MainBMP, ClientRect, ClientRect, 1);
Canvas.EndScene;
end;

关于delphi - 在 Canvas 上绘制旋转位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31943119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com