Delphi FireMonkey应用程序无法绘制简单的黑色矩形

时间:2013-08-18 17:30:28

标签: delphi canvas opacity firemonkey delphi-xe3

只需创建简单的FireMokey HD应用程序,在表单上放置带有align = alclient的TImage并尝试绘制简单的黑色矩形:

procedure TForm8.FormCreate(Sender: TObject);
var
  c: TCanvas;
begin
  Image.Bitmap := TBitmap.Create(ClientWidth, ClientHeight);
  c := Image.Bitmap.Canvas;
  c.BeginScene;
  try
    c.Clear(claWhite);
    c.Stroke.Color := claBlack;
    c.Stroke.Kind := TBrushKind.bkSolid;
    c.DrawRect(
      TRectF.Create(7,7,ClientWidth-7,ClientHeight-7),
      0,0,
      [],
      1
    );
  finally
    c.EndScene;
  end;
end;

它不起作用。矩形的颜色不是黑色,它是一种灰色。角落里的颜色有些变化。我需要设置一些其他属性或这里有什么问题吗? 我尝试了不同的不透明度值(1,100,255,65535),图片根本没有变化,并且帮助中没有信息这个选项意味着什么。 放大左上角:

enter image description here

还尝试使用如示例中所述的多边形。同样的问题 - 圆角和灰色而不是黑色(图像的不透明度属性为1,默认情况下所有属性):

procedure TForm8.Button2Click(Sender: TObject);
var
  p1, p2, p3, p4, p5: TPointF;
  MyPolygon: TPolygon;
begin
  // sets the points that define the polygon
  p1.Create(100, 100);
  p2.Create(200, 100);
  p3.Create(200, 200);
  p4.Create(100, 200);
  p5.Create(100, 100);
  // creates the polygon
  SetLength(MyPolygon, 5);
  MyPolygon[0] := p1;
  MyPolygon[1] := p2;
  MyPolygon[2] := p3;
  MyPolygon[3] := p4;
  MyPolygon[4] := p5;
  Image.Bitmap.Canvas.BeginScene;
  // draws the polygon on the canvas
  Image.Bitmap.Canvas.DrawPolygon(MyPolygon, 50);
  Image.Bitmap.Canvas.EndScene;
  // updates the bitmap
//  Image.Bitmap.BitmapChanged;
 end;

2 个答案:

答案 0 :(得分:1)

http://roman.yankovsky.me/?p=1018

if Canvas.BeginScene then
try
  Canvas.Stroke.Thickness := 1.5;
  Canvas.Stroke.Kind := TBrushKind.bkSolid;
  Canvas.Fill.Color := TAlphaColorRec.Black;
  Canvas.Fill.Kind := TBrushKind.bkSolid;

  for I := 1 to 9 do
  begin
    Canvas.DrawLine(PointF(50 + I * 25 - (Canvas.Stroke.Thickness / 2), 0),
      PointF(50 + I * 25 - (Canvas.Stroke.Thickness / 2), ClientHeight), 1);
  end;
finally
  Canvas.EndScene;
end;

答案 1 :(得分:0)

一旦您了解了 Firemonkey 的更好范式,这个问题就很容易解决。 Firemonkey 使用实坐标,而不是整数坐标。您不知不觉地告诉它以像素之间的边界为中心绘制线条,因此您的每条线条一半在一组像素中,一半在另一组像素中。

具体来说,发生的情况是您的整数坐标被解释为连续数轴上的精确中心点。例如,假设点是 7。以 7.0 点为中心的宽度为 1 的线将从数轴上的 6.5 延伸到 7.5。但是因为像素在数轴上从 6.0 延伸到 6.99,从 7.0 延伸到 7.99,所以每个像素都是一半黑一半白。自动抗锯齿导致它们被绘制为 50% 的黑色,这就是两像素宽灰色的来源。

在使用 FMX(现在称为 FMX)时,您必须将您的想法从整数坐标转换为实坐标,后者更加复杂和强大。

最简单的解决方案是将基于整数的数学向右移动 0.5,向下移动 0.5。然后 7.5 处的 1 像素宽线将从 7.0 延伸到 7.999,这正是您所期望的。为此,只需在发出绘图命令时将 0.5 添加到所有像素坐标,包括水平和垂直。

好消息是,0.8 像素宽或 1.5 像素宽的线条会自动分别显得更细或更粗。对角线和其他曲线看起来是正确的,没有锯齿状边缘。您可以缩放复杂的绘图,它们在任何缩放级别下看起来都很完美。 (半像素偏移的数学计算对于所有缩放级别都保持不变。在绘制线条之前缩放后立即添加 0.5。)

以上适用于所有设备:屏幕、位图和打印机等。因此,在屏幕上绘制的相同代码可用于绘制其他所有设备。绘制文本时,您可以对字体使用小数点大小,以便它们与其他所有内容一起缩放。