0

只需创建简单的 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),图片根本没有改变,帮助中没有任何信息,这个选项到底意味着什么。放大的左上角:

在此处输入图像描述

还尝试使用示例中描述的多边形。同样的问题-圆角和灰色而不是黑色(图像的不透明度属性为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;
4

2 回答 2

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;
于 2014-05-12T05:00:53.047 回答
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 处的一像素宽的线将从 7.0 延伸到 7.999,这正是您所期望的。为此,只需在您发出绘图命令时将所有像素坐标(水平和垂直)添加 0.5。

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

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

于 2021-08-07T02:40:14.637 回答