2012-05-15 22 views
35

Ben FireMonkey (32x24 piksel diyelim) küçük bir bit eşlem olduğunu varsayalım. Bu yüzden bir form üzerine bir TImage koymak ve yapıcı bu kod var:FireMonkey (FMX) Bitmap ve renkleri

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; 

Bu Blackground güzel bir diyagonal çizgi çizer.

Şimdi yapmak istediğim, çizgi çizmesinden etkilenen pikselleri belirlemek için bitmap'i ayrıştırmak. Ben kullanarak piksel çekle temel piksel yaparsanız:

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]])); 

benim Memo üzerine çıktısı:

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 

yüzden yorumlanması ve "bulanık" ne demek? renklerimin (yukarıdaki c ile temsil edilen) çizgisi, claYellow'a ($ FFFF00) eşit değildir. Yatay veya dikey bir çizgi çizersem, efekt aynıdır. İnme kalınlığımı 2 olarak değiştirirseniz ve çapraz olmayan bir çizgi çizersem, clady-kat çizer ama 2 piksel kaplar.

Çizdiğim "doğru" pikselleri nasıl belirleyebilirim? Yukarıdaki örnekte, FFE7E700 $ 'ı arayabilirdim (ancak), bu değeri aramayı nasıl bilebilirim (çizgiyi farklı bir renkte çizersem, bu değer farklı olurdu). Çizdiğim renk ile işlenen gerçek renk arasında tutarlı bir "fark" olup olmadığını görmeye çalıştım ancak bir tane bulamadı.

Teşekkür

+0

değil bir cevap teşekkür ederim ... ama başka ilginç [soru] (http://stackoverflow.com/questions/8966175/why-is-drawing-a-line-less-than -1-5-piksel-kalın-iki kat-yavaş-çizim-a-line) – Whiler

+7

Ben FireMonkey bilmiyorum, ama bu sıradan bir antialiasing daha ya da daha az bir şey gibi geliyor. – TLama

+1

Bunun FireMonkey ile ilgisi yoktur. Bu, temeldeki grafik sistemine (GDI +, D2D, OpenGL) tamamen bağımlıdır. –

cevap

1

örnekte renkler sizin belirlediğiniz renk ve parça arka plan rengini parçasısın anlamına yumuşatılmıştır. Kesin oran, sahnelerin ardında yapılan birçok değerlendirmeye dayanmaktadır.

FireMonkey (veya Delphi) aşina

değil, bu yüzden onun etrafında bir yol varsa ben söyleyemem, ancak belli bir renk RGB değerleri arasındaki oranları sınamak size neler yapabileceğini toprakları nerede olduğunu bilmek istiyorsanız, o siyah bir arka plan üzerinde sadece bir çizgi çizin farz ediyor (aksi takdirde, oranlar gürültü büyük miktarlarda pikselleri yakalamak için bir aralık olmalıdır)

örnek: sarı (# FFFF00)

kırmızı/yeşil = 1

kırmızı/mavi = yeşil/mavi = # inf (veya isterseniz, 255/1 = 255)

gürültü ile

örneklenmiş bir piksel # fcff09 olabilir örneklenmiş bir piksel oranlarını muhafaza # fcfc00 olabilir sahip

= kırmızı/yeşil 0.988

=/kırmızı, mavi 28

=/yeşil, mavi 28.33

kırmızı ve yeşil hala oldukça yakın ve maviden çok daha yüksek. Çizim için antialiazing

5

FMX'in kullanımı.

  • TCanvas.AlignToPixel
  • TCanvas.AlignToPixelVertically
  • TCanvas.AlignToPixelHorizontally
: Eğer bulanıklık efekti olmadan çekme hattını isterseniz piksel hizalama için özel fonksiyonu kullanmalısınız

Bu işlev, bulanıklık olmadan çizim için piksel konumunu otomatik olarak hesaplar.

Sorunuzun

+0

Teşekkürler. Sadece buna geri dönebildim. Cevabınızı detaylandırır ve yukarıdaki örnekte bu işlevlerin nasıl kullanılacağını gösterir misiniz? Bu işlevler hakkında her yerde yaklaşık 0 dokümantasyon var ve denediğim şey okumayı değiştirmiyor - şimdi bitmap'in Map/Unmap'ını kullansam bile. – Jason