Firemonkey(FMX)位图和颜色

假设我在Firemonkey中有一个小的位图(比如32×24像素)。 所以我把一个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; 

这在blackground上画了一条很好的对angular线。

我想要做的是现在parsing位图来确定受到线条绘制影响的像素。 如果我做一个基本的像素检查使用:

  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,然后绘制非对angular线,则绘制的是claYellow,但它会覆盖2个像素。

那么我怎样才能确定我绘制的“真实”像素。 在上面的示例中,我会(可能)寻找$ FFE7E700,但我怎么知道要查找该值(假设如果我画了一条不同的颜色,这个值将是不同的)。 我试图看看是否有一个一致的“差异”,我画了颜色和实际颜色呈现,但无法find一个。

谢谢

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

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

这个function自动计算没有模糊的绘图的像素位置。

谢谢

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

不熟悉FireMonkey(或delphi),所以我不能告诉你是否有解决办法,但是如果你想知道某个颜色到底在哪里,你可以做的就是testingRGB值之间的比率,假设你绘制黑色背景上只有一行(否则,比例必须是捕捉大量噪声像素的范围)

例如:黄色(#ffff00)

红色/绿色= 1

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

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

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

红/绿= 0.988

红色/蓝色= 28

绿/蓝= 28.33

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