【问题标题】:Delphi: Export/Draw TPaintbox straight to file with custom image sizeDelphi:将 TPaintbox 直接导出/绘制到具有自定义图像大小的文件
【发布时间】:2013-06-06 06:27:58
【问题描述】:

我用几个帮助函数对ExtCtrls.TPaintBox 进行了子类化,并覆盖了Paint 方法。我可以将TPaintBox 添加到一个表单中,然后该表单充当我的自定义paintbox 对象并绘制所需的输出。

现在我想将我的画框的内容绘制(写入)到一个文件中,但尺寸不同;例如在我的应用程序的 UI 中,paintbox 的大小为 150x600(宽 x 高),但是当绘制到文件时,我需要它更大。

我希望能够重复使用我的绘图代码 (= TPaintBox.Paint) 并将其虚拟绘制到 an object,然后将该对象保存到文件中。

我已经可以导出它了,但是在导出时调整大小会使图像看起来像你会用油漆放大它。

【问题讨论】:

  • 你能展示你的TPaintBox.Paint()方法吗?如果您只绘制矢量对象,则需要以更高的分辨率重新绘制它们以获得更大的输出。如果您使用的是位图数据,那么您需要从任何原始来源创建或保留高分辨率数据。您不能以其他方式放大位图数据提高分辨率 - 您需要一个高分辨率源开始。唯一的其他选择可能是对较大图像进行抗锯齿的一些巧妙的后期处理。
  • 就像 J 说的,你应该从大到小,而不是相反。
  • 我确实在绘制矢量对象(矩形、饼图),而这正是我所需要的:以比当前屏幕上显示的分辨率更高的分辨率输出。

标签: delphi drawing save paintbox


【解决方案1】:

您的画框OnPaint 事件处理程序可能专用于画到画框的大小。您需要概括绘画代码,以便能够绘制到仅在运行时才知道大小的通用画布。这样您就可以使用相同的绘画代码绘制到低分辨率绘画框和高分辨率文件。

OnPaint 事件处理程序中的代码提取到一个单独的方法中,如下所示:

procedure TForm1.DoPaintBoxPaint(Canvas: TCanvas);
begin
  // All painting code goes here. Use Canvas.ClipRect to infer size of canvas.
end;

然后从您的 OnPaint 处理程序中调用此方法。将PaintBox1.Canvas 作为参数传递给方法。

大致如下:

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  DoPaintBoxPaint(PaintBox1.Canvas);
end;

最后,您可以从将图像保存到文件的方法中调用该方法。在这种情况下,我假设您有一个临时位图,可以在保存之前在其上绘制图像。传递该位图的画布。该代码的草图将是:

Bitmap := TBitmap.Create;
try
  Bitmap.SetSize(Width, Height);
  DoPaintBoxPaint(Bitmap.Canvas);
  Bitmap.SaveToFile(...);
finally
  Bitmap.Free;
end;

【讨论】:

  • 这如何帮助他实现这一目标?他需要图形与 Canvas 一起缩放。
  • @Peter 再多的代码也无法通过魔法实现。绘图代码必须能够绘制以适合目标画布的大小。提问者必须做点什么。使用 Canvas.ClipRect 找出要绘制的尺寸。所以没有硬编码的坐标。所有坐标都根据 ClipRect 进行缩放。
  • 我很清楚魔法不存在,谢谢。我只是想让你向我解释为什么你认为这个答案回答了他的问题。
  • @Peter 我添加了一个额外的介绍段落。你现在明白了吗?
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2022-05-30
  • 1970-01-01
  • 2012-03-31
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多