Firemonkey(FMX)位图和颜色

时间:2012-05-15 00:53:13

标签: delphi delphi-xe2 firemonkey

假设我在Firemonkey中有一个小位图(例如32x24像素)。所以我把一个TImage放到一个表单上,在构造函数中有这个代码:

  Image1.Bitmap.Create(32, 24);
  if Image1.Bitmap.Canvas.BeginScene then
  try
    Image1.Bitmap.Canvas.Fill.Color := claBlack;
    Image1.Bitmap.Canvas.Stroke.Color := claYellow;
    Image1.Bitmap.Canvas.FillRect(RectF(0,0,32,24), 0, 0, AllCorners, $FF);
    Image1.Bitmap.Canvas.DrawLine(PointF(1,1), PointF(10,10), $FF);
  finally
    Image1.Bitmap.Canvas.EndScene;
    Image1.Bitmap.BitmapChanged;
  end;

这会在背景上绘制一条漂亮的对角线。

我想要做的是现在解析位图以确定受线条绘制影响的像素。如果我使用以下方法逐像素检查:

  for y := 0 to 23 do
    for x := 0 to 31 do
      if Image1.Bitmap.Pixels[x,y] <> claBlack then
        memo1.Lines.Add(Format('x=%d. y=%d. c=%x', [x,y,Image1.Bitmap.Pixels[x,y]]));

我的备忘录的输出是:

x=0. y=0. c=FF3C3C00
x=1. y=0. c=FF3C3C00
x=0. y=1. c=FF3C3C00
x=1. y=1. c=FFE7E700
x=2. y=1. c=FF3C3C00
x=1. y=2. c=FF3C3C00
x=2. y=2. c=FFE7E700
x=3. y=2. c=FF3C3C00
x=2. y=3. c=FF3C3C00
x=3. y=3. c=FFE7E700
x=4. y=3. c=FF3C3C00
x=3. y=4. c=FF3C3C00
x=4. y=4. c=FFE7E700
x=5. y=4. c=FF3C3C00
x=4. y=5. c=FF3C3C00
x=5. y=5. c=FFE7E700
x=6. y=5. c=FF3C3C00
x=5. y=6. c=FF3C3C00
x=6. y=6. c=FFE7E700
x=7. y=6. c=FF3C3C00
x=6. y=7. c=FF3C3C00
x=7. y=7. c=FFE7E700
x=8. y=7. c=FF3C3C00
x=7. y=8. c=FF3C3C00
x=8. y=8. c=FFE7E700
x=9. y=8. c=FF3C3C00
x=8. y=9. c=FF3C3C00
x=9. y=9. c=FFE7E700
x=10. y=9. c=FF3C3C00
x=9. y=10. c=FF3C3C00
x=10. y=10. c=FF3C3C00

所以这是解释和“模糊”?我的行作为颜色(由上面的c表示)不等于claYellow($ FFFF00)。如果我绘制水平或垂直线,效果是相同的。如果我将笔触粗细更改为2并绘制非对角线,则会绘制为clayo,但它会覆盖2个像素。

那么如何确定我所使用的“真实”像素。在上面的示例中,我会(可能)寻找$ FFE7E700,但我怎么知道要查找该值(假设我画了不同颜色的线,那么该值会有所不同)。我试图看看我绘制的颜色与实际渲染的颜色之间是否存在一致的“差异”,但无法找到它。

由于

2 个答案:

答案 0 :(得分:5)

FMX使用antialiazing进行绘图。如果你想绘制没有模糊效果的线条,你应该使用特殊的像素对齐功能:

  • TCanvas.AlignToPixel
  • TCanvas.AlignToPixelVertically
  • TCanvas.AlignToPixelHorizo​​ntally

此功能可自动计算绘图的像素位置,而不会模糊。

谢谢

答案 1 :(得分:1)

示例中的颜色是消除锯齿的,这意味着它们是您设置的颜色的一部分,并且是背景颜色的一部分。精确的比例基于幕后的许多考虑因素。

不熟悉FireMonkey(或delphi),所以我无法告诉你是否有办法绕过它,但如果你想知道某种颜色落在哪里你可以做的是测试RGB值之间的比率,那就是假设您在黑色背景上仅绘制一条线(否则,比率必须是捕捉具有大量噪声的像素的范围)

例如: 黄色(#FFFF00)

  

红色/绿色= 1

     

红色/蓝色=绿色/蓝色= #inf(或者如果你想要,255/1 = 255)

采样像素可以是#fcfc00维持比率

带噪声的采样像素可能是#fcff09

  

红/绿= 0.988

     

红色/蓝色= 28

     

绿/蓝28.33 =

红色和绿色仍然非常接近,并且都比蓝色高得多。