2012-05-15 96 views
35

假設我在Firemonkey中有一個小的位圖(比如32x24像素)。所以我把一個TImage放在一個表單上,在構造函數中有這樣的代碼:Firemonkey(FMX)位圖和顏色

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上畫一條很好的對角線。

我想要做的是現在解析位圖以確定受線條繪製影響的像素。如果我使用像素檢查做一個基本的像素:

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,但我怎麼知道要查找該值(因爲如果我用不同顏色繪製線條,該值將會不同)。我試圖看看在我繪製的顏色和實際渲染的顏色之間是否存在一致的「差異」,但找不到一個。

感謝

+0

不回答你的問題......但另一個有趣的[問題](http://stackoverflow.com/questions/8966175/why-is-drawing-a-line-less-than -1-5像素厚 - 兩倍於緩慢的繪製線) – Whiler

+7

我不知道FireMonkey,但這聽起來像沒有比普通的抗鋸齒更多或更少。 – TLama

+1

這與FireMonkey無關。它完全依賴於底層圖形系統(GDI +,D2D,OpenGL)。 –

回答

1

在本例中的顏色是反鋸齒,這意味着他們的部分設置顏色,部分背景顏色。精確的比例是基於幕後完成的許多考慮。我不能告訴你是否有解決方法,但如果你想知道某種顏色在哪裏出現,你可以做的就是測試RGB值之間的比率,如果你不知道FireMonkey(或delphi)這是假設你畫在黑色背景上只有一行(否則,該比率必須趕上與大量噪聲像素的範圍)

例如: 黃色(#FFFF00)

紅/綠= 1

紅色/藍色=綠色/藍色=#inf(或者如果你想要的話,255/1 = 255)

一個採樣的像素可能是#fcfc00維持比

與噪聲採樣的像素可能是#fcff09具有

紅色/綠色= 0.988

紅色/藍色= 28

綠色/藍色= 28.33

紅色和綠色仍然非常接近,都比藍色高得多。

5

FMX使用antialiazing繪圖。如果您想無殘影效果拉繩你應該使用特殊功能的像素排列:

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

這個函數自動計算沒有模糊的繪圖的像素位置。

謝謝

+0

謝謝。我只是能夠回到這一點。你能否詳細說明你的答案,並說明在上面的例子中如何使用這些函數。關於那些函數的任何地方都有很多文檔,我所嘗試的並不會改變讀取 - 即使我現在使用位圖的Map/Unmap。 – Jason