2009-08-17 10 views
8

मैं एक पारदर्शी बिटमैप पर एंटीअलाइज्ड टेक्स्ट खींचना चाहता हूं और एंटीअलाइजिंग अल्फा मिश्रित पिक्सल के रूप में खींचा गया हूं। इस तरह, मैं किसी भी रंग की सतह (या उस छवि के लिए एक छवि) पर बिटमैप खींच सकता हूं और एंटीअलाइजिंग अभी भी ठीक दिखता है।पारदर्शी बिटमैप पर एंटीअलाइज्ड टेक्स्ट

यहाँ एक सरल नमूना समस्या दिखा रहा है:

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    Bitmap bitmap = new Bitmap(this.Width, this.Height); 
    Graphics g = Graphics.FromImage(bitmap); 
    g.Clear(Color.Empty); 
    g.DrawString("hello world", new Font(this.Font.FontFamily, 24), Brushes.Blue, new Point(50, 50)); 
    e.Graphics.DrawImage(bitmap, new Point(0, 0)); 
} 

और यहाँ परिणाम है:

alt text http://img194.imageshack.us/img194/9065/captureotd.png

इस का अंतिम लक्ष्य मेरी पारदर्शी अल्फा मिश्रित आकर्षित करने के लिए UpdateLayeredWindow उपयोग करने के लिए है खिड़की। मैं एक कंककी जैसी एप्लिकेशन बना रहा हूं, और मैं टेक्स्ट के लिए क्लियरटाइप प्रतिपादन का उपयोग करने में सक्षम होना चाहता हूं (यह निश्चित रूप से एंटीअलाइजिंग के बिना आसान है)।

वर्तमान में, मैं फॉर्म के पीछे स्क्रीन पकड़ता हूं, इसे खींचता हूं, और फिर अपना टेक्स्ट खींचता हूं। यह अच्छा लग रहा है, लेकिन इसे अद्यतन किया जाना है और आकर्षित करने में धीमा है। डेस्कटॉप पर ड्राइंग टेक्स्ट को पूरा करने के लिए कोई अन्य विचार भी स्वागत किया जाएगा।

उत्तर

15

आपका टेक्स्ट प्रदर्शित होता है क्योंकि आपके पास ClearType उप-पिक्सेल एंटी-एलियासिंग मोड सक्षम है (जो Vista और ऊपर डिफ़ॉल्ट है)। निश्चित रूप से क्लीयरटाइप अल्फा चैनल के साथ अच्छा नहीं खेल सकता है, क्योंकि यह रंग मिश्रण करता है, और इस प्रकार पृष्ठभूमि-अज्ञेयवादी नहीं है। तो यह अल्फा चैनल को अनदेखा करता है, और काले रंग में मिश्रण करता है (जो आपका पारदर्शी रंग अन्यथा है)। आप वांछित प्रभाव के लिए सादे ग्रेस्केल विरोधी aliasing सक्षम करना होगा:

g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 
+0

यह अच्छी तरह से काम किया, धन्यवाद! यह क्लीयरटाइप के रूप में काफी सुंदर नहीं है, लेकिन क्लियरटाइप (पूर्व कंसोलस) के लिए डिज़ाइन किए गए फोंट अभी भी ठीक दिखते हैं। – iano

+0

उत्सुकता से, मेरे लिए 'AntiAliasGridFit' शून्य एंटी-एलियासिंग के साथ पाठ उत्पन्न करता है। हालांकि, एंटीअलीस, काम करता है। –

+0

'एंटीअलीस ग्रिडफ़िट' एंटी-एलियासिंग नहीं कर सकता है यदि फ़ॉन्ट का आकार बहुत छोटा है। ऐसे फ़ॉन्ट आकारों पर, 'एंटीअलीस' वैसे भी एक बदसूरत परिणाम देता है। –

1

मुझे यकीन है कि अगर यह वास्तव में आवश्यक है नहीं कर रहा हूँ, लेकिन अगर आप अल्फा सम्मिश्रण क्या करना चाहते हैं, तो आप एक 32-बिट छवि का होना चाहिए: अपने उदाहरण का उपयोग

Bitmap bitmap = new Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

, मैं बनाने के लिए कर रहा था टेक्स्ट प्रतिपादन संकेत जोड़कर सभ्य दिखता है:

g.Clear(Color.Empty); 
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
g.DrawString("hello world", new Font(this.Font.FontFamily, 24), Brushes.Blue, new Point(50, 50)); 

क्या यह वही कर रहा है जो आप चाहते हैं, या केवल समस्या को छिपा रहे हैं?

+3

यदि आप छोड़ देते हैं 'Bitmap' के' PixelFormat', यह 'करने के लिए डिफ़ॉल्ट वैसे भी Format32bppArgb'। –

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