假设我在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,但我怎么知道要查找该值(假设我画了不同颜色的线,那么该值会有所不同)。我试图看看我绘制的颜色与实际渲染的颜色之间是否存在一致的“差异”,但无法找到它。
由于
答案 0 :(得分:5)
FMX使用antialiazing进行绘图。如果你想绘制没有模糊效果的线条,你应该使用特殊的像素对齐功能:
此功能可自动计算绘图的像素位置,而不会模糊。
谢谢
答案 1 :(得分:1)
示例中的颜色是消除锯齿的,这意味着它们是您设置的颜色的一部分,并且是背景颜色的一部分。精确的比例基于幕后的许多考虑因素。
不熟悉FireMonkey(或delphi),所以我无法告诉你是否有办法绕过它,但如果你想知道某种颜色落在哪里你可以做的是测试RGB值之间的比率,那就是假设您在黑色背景上仅绘制一条线(否则,比率必须是捕捉具有大量噪声的像素的范围)
例如: 黄色(#FFFF00)
红色/绿色= 1
红色/蓝色=绿色/蓝色= #inf(或者如果你想要,255/1 = 255)
采样像素可以是#fcfc00维持比率
带噪声的采样像素可能是#fcff09
红/绿= 0.988
红色/蓝色= 28
绿/蓝28.33 =
红色和绿色仍然非常接近,并且都比蓝色高得多。