Firemonkey(FMX)位图和颜色

假设我在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并绘制一条非对角线,则它将绘制在claYellow中,但它会覆盖2个像素。

那么我怎么才能确定我所绘制的“真实”像素。 在上面的示例中,我会(可能)查找$ FFE7E700,但我怎么知道要查找该值(因为如果我用不同颜色绘制线条,该值将会不同)。 我试图看看在我绘制的颜色和实际渲染的颜色之间是否存在一致的“差异”,但找不到一个。

谢谢


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

  • TCanvas.AlignToPixel
  • TCanvas.AlignToPixelVertically
  • TCanvas.AlignToPixelHorizo​​ntally
  • 该功能自动计算绘图时的像素位置而不模糊。

    谢谢


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

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

    例如:黄色(#ffff00)

    红色/绿色= 1

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

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

    一个有噪声的采样像素可能是#fcff09了

    红/绿= 0.988

    红色/蓝色= 28

    绿/蓝= 28.33

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

    链接地址: http://www.djcxy.com/p/60473.html

    上一篇: Firemonkey (FMX) bitmap and colours

    下一篇: Pixel Shader model > 2.0 in FireMonkey