【问题标题】:FMX: Fill whole bitmap with a background colorFMX:用背景颜色填充整个位图
【发布时间】:2014-08-28 16:46:10
【问题描述】:

我想创建一个TImage 组件并用背景颜色填充图像。但是我的代码比我预期的要长一点。

  1. 我必须设置位图的宽度和高度。
  2. 我必须计算整个位图画布的矩形。

如果我没记错的话,在旧的 Delphi 版本中,我可以使用 FloodFill 用特定颜色填充整个图像。所以我想我肯定错过了一些东西。

有人能弄清楚如何用更简单的代码填充背景颜色吗?

Image := TImage.Create(nil);
Image.Position.X := 100;
Image.Position.Y := 100;
Image.Width := 500;
Image.Height := 500;
Image.Bitmap.Width := Trunc(Image.Width);
Image.Bitmap.Height := Trunc(Image.Height);
with Image.Bitmap.Canvas do
begin
  BeginScene;
  try
    Fill.Color := TAlphaColors.Black;
    FillRect(RectF(0, 0, Image.Bitmap.Width, Image.Bitmap.Height), 0, 0, [], 1.0);
  finally
    EndScene;
  end;
end;

【问题讨论】:

  • 你最好停止使用 with。您需要的是一个局部变量 Bitmap,因此您只需要编写一次 Image.Bitmap。尽量不要以这种方式重复自己。

标签: delphi canvas bitmap firemonkey graphic


【解决方案1】:

FMX 中没有 FloodFill。但是您可以使用Clear(TAlphaColors.Black); 来为整个位图填充颜色。

【讨论】:

  • 感谢您的提示。我最初的问题中的另一件事是我必须设置位图的尺寸。我不明白为什么有必要。 TImage 只能保存一个位图。位图是否应该与图像组件的大小不同?
  • 在视网膜显示器上,图像可能需要与控件具有不同的大小。但在这种情况下,他们仍然可以为位图设置默认大小。
  • 为什么视网膜会有所作为?
  • 如果我在 Retina 设备上运行 stanleyxu2005 的示例代码,我会在 Image 控件的中心看到一个黑色矩形(即图像大小的一半)。您必须将图像的大小与 Image.Scene.GetSceneScale 相乘(不要忘记检查 Image.Scene 是否已分配)或使用 WrapMode。
【解决方案2】:

您必须设置位图尺寸的原因是因为位图大小不必与 TImage 大小相同。您可以拥有比 TImage 更小或更大的位图,然后使用 WrapModes 之一来确定该图像将如何呈现到 TImage:

WrapMode 属性应该是 TImageWrapMode 类型中定义的常量之一:

  • iwOriginal:以原始尺寸显示图像。
  • iwFit:TImage 矩形的最佳拟合(保持图像比例——宽度和高度之间的比率)。默认。
  • iwStretch:拉伸图像以填充此 TImage 组件的整个矩形。
  • iwTile:平铺 TImage 图像以覆盖 TImage 组件的整个矩形。

至于计算整个位图的矩形。如果您希望您的位图与 TImage 具有相同的大小,那么您可以轻松读取 TImage.ClipRect。

ClipRect 通常是代表控件内部的矩形,您可以在其上进行渲染。在像 TPanel 这样有边框的控件上,例如 ClipRect 尺寸小于整个控件的尺寸。

正如 Sebastian 所说,您可以使用 TBitmap.Clear 方法快速用单一颜色填充整个位图表面背景。

【讨论】:

  • 感谢您提供非常详细和有教育意义的答案。我使用代码完成来找到TImage 的合适属性,但我看到ClipRect 时太盲目了。
  • ClipRect 可能无法在视网膜设备上为您提供所需的结果。
  • 为什么不呢? ClipRect 是控件剪辑区域的大小表示,以像素表示。
  • 在 Retina 设备上,位图的四个像素将被绘制到表单的 ClipRect 坐标中的一个“像素”中。所以位图不会填满整个TImage。如果您没有 Retina 设备,请在 iPad 模拟器上尝试。
  • 我会尝试一下,但我只有 Delphi X6 Proffesional,它不允许我为移动平台编译。我至少需要企业版或移动插件。但是为什么会在表单的ClipRect坐标中将Bitmap的四个像素画成一个像素呢?
猜你喜欢
  • 1970-01-01
  • 2012-01-28
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
相关资源
最近更新 更多