问题描述
我需要在另一个位图的画布(主位图)上绘制旋转的位图。但我不知道该怎么做。
我试着用TBitMap.Rotate方法旋转位图,然后用TCanvas.DrawBitmap方法在主要的BitMap上绘制它,但它需要很多时间(我需要绘制~100个不同角度的相同位图):
$ b
- 调整BMP大小
- 旋转BMP
- 在另一个画布上绘制
如何立即绘制不带1的旋转位图2步?
示例:
您应该使用转换 Matrix 而不是<$ c
这可能看起来像:
p $ p> procedure TForm1.Timer1Timer(Sender:TObject);
<$>
var
I:Integer;
R:TRectF;
SaveMatrix:TMatrix;
矩阵: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:=随机(1200);
Matrix.m32:=随机(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;
I need to draw rotated bitmap on an another bitmap's canvas (main Bitmap). But i have no idea how.
I tried to rotate bitmap with TBitMap.Rotate method and then draw it on main BitMap with TCanvas.DrawBitmap method, but it takes a lot of time (i need to draw ~100 same Bitmaps with different angles):
- resize BMP
- rotate BMP
- draw on another canvas
How to immediately draw rotated bitmap without 1 and 2 steps?
Example:
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;
without
buffBMP.Rotate(random(360));
it takes 16-32 ms. With this method: ~8500 ms
I'm searching for some method like
TCanvas.DrawBitmap(const ABitmap: TBitmap; const SrcRect, DstRect: TRectF; const AOpacity: Single; const HighSpeed: Boolean);
but with added Angle: single parametr
Android. FMX.
Thanks.
You should use a transformation Matrix instead of the Rotate method on the bitmap.
Such could look like:
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;
这篇关于在画布上绘制旋转的位图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!