【问题标题】:Image canvas drawing ends up on form instead图像画布绘图最终出现在表单上
【发布时间】:2014-09-06 07:46:32
【问题描述】:

我正在尝试在 TImage 的画布上绘制一些自定义形状,但输出最终会出现在 TImage 父窗体的画布上。看来我必须将我的点从本地转换为绝对点才能完成这项工作,但这也会导致问题。见例子:

  • 有谁知道为什么 Image.Canvas.DrawArc (etc) 相对于父窗体而不是相对于图像进行绘制?
  • 如果我遇到 .LocalToAbsolute 的麻烦...为什么弧看起来如此不同?

项目很简单:Firemonkey HD 表格,中间有TPanel,TPanel 里面有TImage(与客户端对齐)。按钮只是执行代码。

代码如下:

    unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
  FMX.Objects;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}


procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Canvas.BeginScene;

  {Trying to draw arc and line on Image's canvas - Doesn't work; it draws to Form's canvas instead}
  Image1.Canvas.DrawArc(PointF(0,0), PointF(10, 10), 0.0, 45.0, 1.0);
  Image1.Canvas.DrawLine(PointF(0.0, 0.0), PointF(100, 100), 1.0);

  {Trying to draw arc and line on Image's canvas - This works; by why should such steps be necessary and why is the arc so different?}
  Image1.Canvas.DrawArc(Image1.LocalToAbsolute(PointF(0,0)), Image1.LocalToAbsolute(PointF(10, 10)), 0.0, 45.0, 1.0);
  Image1.Canvas.DrawLine(Image1.LocalToAbsolute(PointF(0.0, 0.0)), Image1.LocalToAbsolute(PointF(100, 100)), 1.0);

  Image1.Canvas.EndScene;
end;

end.

【问题讨论】:

  • 请在您的 delphi 相关问题中包含通用的delphi 标签
  • 没有XE6,但是在XE5中必须在图像位图的画布中绘制,即Image1.Bitmap.Canvas.DrawArc(PointF(0,0), PointF(10, 10), 0.0 , 145.0, 1.0);
  • @SirRufo 感谢您的提示!下次我会这样做。
  • @LHristov 谢谢。我刚才试过了,但没有解决问题。我将代码(在 BeginScene 和 EndScene 之间)更改为 Image1.Bitmap.Canvas.DrawArc(PointF(0,0), PointF(10, 10), 0.0, 145.0, 1.0); Image1.Bitmap.Canvas.DrawLine(PointF(0.0, 0.0), PointF(100, 100), 1.0); 第一个似乎根本没有做任何事情,第二个导致尝试访问地址 0x00000000 时出现异常。
  • 我会在你的代码修改后添加一个答案

标签: delphi firemonkey delphi-xe6 firemonkey-fm3


【解决方案1】:

正如我之前提到的,这是针对 XE5 的。这是你的代码:

procedure TForm3.Button1Click(Sender: TObject);
begin
  Image1.Bitmap.Canvas.BeginScene;

  {Trying to draw arc and line on Image's canvas - Doesn't work; it draws to Form's canvas instead}
  Image1.Bitmap.Canvas.DrawArc(PointF(0,0), PointF(10, 10), 0.0, 145.0, 1.0);
  Image1.Bitmap.Canvas.DrawLine(PointF(0.0, 0.0), PointF(200, 200), 1.0);

  {Trying to draw arc and line on Image's canvas - This works; by why should such steps be necessary and why is the arc so different?}
  Image1.Bitmap.Canvas.DrawArc(Image1.LocalToAbsolute(PointF(0,0)), Image1.LocalToAbsolute(PointF(10, 10)), 0.0, 45.0, 1.0);
  Image1.Bitmap.Canvas.DrawLine(Image1.LocalToAbsolute(PointF(0.0, 0.0)), Image1.LocalToAbsolute(PointF(100, 100)), 1.0);

  Image1.Bitmap.Canvas.EndScene;

end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  Image1.Bitmap:=TBitmap.Create(trunc(image1.Width),trunc(image1.Height));
end;

您没有粘贴位图的创建过程。

【讨论】:

  • 设置 Image1.Bitmap 内部调用 Bitmap.Assign。因此你会泄露一个 TBitmap。
  • 好吧,我觉得不创建位图很愚蠢。哎呀!但是,要么他们在 XE6 中更改了某些内容,要么我仍然做错了什么,因为我的代码中没有可见的显示以及您所做的修改。我会尝试备份并在XE5中运行以确认。
  • @Sebastian Z:是的,但是 Image1.Bitmap.SetSize 是必需的,因为在 0x0 位图上绘图会引发异常
【解决方案2】:

好吧,我也遇到了一些问题,你应该像@LHristov 所说的那样使用位图。唯一的问题是有一个错误没有正确设置位图大小,对此的修复如下:

procedure TForm3.FormCreate(Sender: TObject);
begin
  bitmap := TBitmap.Create;
  bitmap.SetSize(round(Image1.Width), round(Image1.Height));
  Image1.MultiResBitmap.Bitmaps[1].Assign(bit);
  Image1.Bitmap := Image1.MultiResBitmap.Bitmaps[1];
  Image1.Bitmap.Clear(TAlphaColorRec.White);
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  Image1.Bitmap.Canvas.BeginScene;

  Image1.Bitmap.Canvas.DrawArc(PointF(0,0), PointF(10, 10), 0.0, 145.0, 1.0);
  Image1.Bitmap.Canvas.DrawLine(PointF(0.0, 0.0), PointF(200, 200), 1.0);

  Image1.Bitmap.Canvas.DrawArc(Image1.LocalToAbsolute(PointF(0,0)), Image1.LocalToAbsolute(PointF(10, 10)), 0.0, 45.0, 1.0);
  Image1.Bitmap.Canvas.DrawLine(Image1.LocalToAbsolute(PointF(0.0, 0.0)), Image1.LocalToAbsolute(PointF(100, 100)), 1.0);

  Image1.Bitmap.Canvas.EndScene;

end;

希望这能为您解决问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2015-02-09
    • 2013-10-28
    • 2016-08-01
    • 2011-01-11
    • 2013-07-20
    相关资源
    最近更新 更多