gpt4 book ai didi

delphi - 在调用 Canvas.DrawBitmap (Firemonkey) 之前对位图应用转换

转载 作者:行者123 更新时间:2023-12-03 15:57:03 25 4
gpt4 key购买 nike

下午好。

我正在开发一个绘图程序,该程序允许用户将加载有位图的 TImage 拖放到 Canvas 上。 (在 RAD Studio XE2 中的 Firemonkey HD 应用程序中)用户可以在保存图像之前更改 x 和 y 比例以及旋转。所有 TImage 都保存在一个列表中,然后使用以下简单过程将该列表写入底层 Canvas :

  for i := 0 to DroppedList.Count - 1 do
begin
AImage := DroppedList[i];
SourceRect.Left := 0;
SourceRect.Right := AImage.Bitmap.Width;
SourceRect.Top := 0;
Sourcerect.Bottom := AImage.Bitmap.Height;

TargetRect.Left := AImage.Position.X;
TargetRect.Right := AImage.Position.X + AImage.Bitmap.Width;
TargetRect.Top := AImage.Position.Y;
TargetRect.Bottom := AImage.Position.Y + AImage.Bitmap.Height;

with FImage.Bitmap do
begin
Canvas.BeginScene;
Canvas.DrawBitmap(AImage.Bitmap, SourceRect, TargetRect, 1, True);
Canvas.EndScene;
BitmapChanged
end;
end;

FImage.Bitmap.SaveToFile('test.bmp');

这样做的问题是,DrawBitmap 不会考虑窗口中可见图像的缩放和旋转变换,并且在保存时会丢失。我正在寻找一种方法,在将位图绘制到背景之前将其应用于位图。我无法找到任何相关信息,所以我希望这里有人可以提供帮助。

谢谢你,丹尼尔

最佳答案

问题似乎是缩放和旋转应用于源 TImage。在这个“源TImage”中,转换不是对位图完成的,而是在TImage级别完成的(因为它是一个TControl,并且与所有TControl一样,它们可以缩放和旋转)。后来您将源位图复制到其他地方,但实际上该位图从未改变

因此必须根据源 TImage 中的设置在循环中旋转和缩放位图:

with FImage.Bitmap do
begin
Canvas.BeginScene;
LBmp := TBitmap.Create;
try
// create a copy on which transformations will be applyed
LBmp.Assign(AImage.Bitmap);
// rotate the local bmp copy according to the source TImage.
if AImage.RotationAngle <> 0 then
LBmp.Rotate( AImage.RotationAngle);
// scale the local bmp copy...
If AImage.Scale.X <> 1
then ;
Canvas.DrawBitmap(LBmp, SourceRect, TargetRect, 1, True);
finally
LBmp.Free;
Canvas.EndScene;
BitmapChanged
end;
end;

这个简单的代码示例很好地解释了这个问题。例如,RotatationAngle 是 AImage 的属性,而不是 AImage.Bitmap 的属性。

避免实现转换的解决方法是使用TControl.MakeScreenshot()。(待验证,这可能会失败)

with FImage.Bitmap do
begin
Canvas.BeginScene;
LBmpInclTranformations := AImage.MakeScreenShot;
Canvas.DrawBitmap(LBmpInclTranformations, SourceRect, TargetRect, 1, True);
Canvas.EndScene;
BitmapChanged
end;

关于delphi - 在调用 Canvas.DrawBitmap (Firemonkey) 之前对位图应用转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12213914/

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