2012-05-15 14 views
35

मान लें कि मेरे पास फायरमोनकी में एक छोटा सा बिटमैप है (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 

तो यह व्याख्या है और "धुंधला"? रंगों के रूप में मेरी रेखा (उपरोक्त सी द्वारा प्रतिनिधित्व) claYellow ($ FFFF00) के बराबर नहीं हैं। यदि मैं एक क्षैतिज या लंबवत रेखा खींचता हूं, तो प्रभाव वही होता है। अगर मैं अपनी स्ट्रोक मोटाई को 2 में बदलता हूं और एक गैर-विकर्ण रेखा खींचता हूं जो इसे क्लेयेलो में खींचता है लेकिन इसमें 2 पिक्सेल शामिल होते हैं।

तो मैं "सच्चे" पिक्सेल को कैसे निर्धारित कर सकता हूं। उपर्युक्त नमूने में मैं $ FFE7E700 की तलाश करूंगा (लेकिन) मुझे उस मूल्य को देखने के लिए कैसे पता चलेगा (दिया गया है कि अगर मैंने एक अलग रंग में रेखा खींची है, तो वह मान अलग होगा)। मैंने यह देखने की कोशिश की कि मेरे द्वारा खींचे गए रंग और वास्तविक रंग के बीच एक लगातार "अंतर" है, लेकिन एक का पता नहीं लगा सका।

धन्यवाद

+0

एक जवाब है ... लेकिन एक और दिलचस्प [सवाल] (http://stackoverflow.com/questions/8966175/why-is-drawing-a-line-less-than -1-5-पिक्सेल-मोटी-दोगुनी-धीमी-जैसी-रेखा-रेखा-रेखा) – Whiler

+7

मुझे फ़ायरमॉन्की नहीं पता, लेकिन यह सामान्य एंटीअलाइजिंग से अधिक या कम नहीं लगता है। – TLama

+1

इसका फ़ायरमॉन्की से कोई लेना देना नहीं है। यह अंतर्निहित ग्राफिक सिस्टम (जीडीआई +, डी 2 डी, ओपनजीएल) पर पूरी तरह से निर्भर है। –

उत्तर

1

उदाहरण में रंग विरोधी aliased हैं, अर्थात अपने हिस्सा हैं रंग आप निर्धारित करते हैं, और भाग पृष्ठभूमि रंग। सटीक अनुपात दृश्यों के पीछे किए गए कई विचारों पर आधारित है।

फ़ायरमॉन्की (या डेल्फी) से परिचित नहीं है, इसलिए मैं आपको यह नहीं बता सकता कि इसके आसपास कोई रास्ता है, लेकिन यदि आप जानना चाहते हैं कि एक निश्चित रंग भूमि कहां कर सकती है तो आप आरजीबी मूल्यों के बीच अनुपात का परीक्षण कर सकते हैं, कि यह सोचते है कि आप एक काले रंग की पृष्ठभूमि पर केवल एक ही रेखा खींचना (अन्यथा, अनुपात एक सीमा शोर की बड़ी मात्रा के साथ पिक्सल पकड़ने के लिए होना चाहिए)

उदाहरण: पीला (# ffff00)

लाल/हरी = 1

लाल/नीला = हरा/नीला = # inf (या यदि आप चाहते हैं, 255/1 = 255)

एक नमूना पिक्सेल

शोर के साथ एक नमूना पिक्सेल # fcff09 हो सकता है अनुपात को बनाए रखने # fcfc00 हो सकता है

लाल/हरी = 0,988

लाल/नीला = 28

हरा/नीला = 28.33

लाल और हरे रंग अभी भी बहुत करीब हैं और दोनों नीले रंग से अधिक हैं।

5

एफएमएक्स ड्राइंग के लिए एंटीअलाइजिंग का उपयोग करें।आप कलंक प्रभाव के बिना ड्रा लाइन चाहते हैं, तो आप पिक्सेल संरेखण के लिए विशेष समारोह का उपयोग करना चाहिए:

  • TCanvas.AlignToPixel
  • TCanvas.AlignToPixelVertically
  • TCanvas.AlignToPixelHorizontally

यह फ़ंक्शन बिना धुंध के ड्राइंग के लिए स्वचालित रूप से पिक्सेल स्थिति की गणना करता है।

आपको अपने प्रश्न का धन्यवाद

नहीं
+0

धन्यवाद। मैं बस इस पर वापस पाने में सक्षम हूं। क्या आप अपने उत्तर पर विस्तार कर सकते हैं और बता सकते हैं कि उपर्युक्त उदाहरण में उन कार्यों का उपयोग कैसे किया जाएगा। कहीं भी उन कार्यों के बारे में बहुत अधिक 0 प्रलेखन है, और मैंने जो कोशिश की है वह पढ़ नहीं बदलती है - भले ही मैं अब बिटमैप के मानचित्र/अनमप का उपयोग करता हूं। – Jason

संबंधित मुद्दे