2012-05-18 17 views
9

के साथ चित्र ड्रा करने के लिए Graphics.DrawImage() का उपयोग करना मैं एक छवि की प्रतिलिपि बना रहा हूं। (मेरा वास्तविक कोड छवि का आकार बदल रहा है लेकिन यह मेरे प्रश्न के लिए प्रासंगिक नहीं है।) मेरा कोड ऐसा कुछ दिखता है।पारदर्शिता/अल्फा चैनल

Image src = ... 

using (Image dest = new Bitmap(width, height)) 
{ 
    Graphics graph = Graphics.FromImage(dest); 
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    graph.DrawImage(src, 0, 0, width, height); 
    dest.Save(filename, saveFormat); 
} 

यह महान काम करने के लिए जब तक src ट्रांसपरेंसिस (जैसे GIF के रूप में) या अल्फ़ा चैनल (जैसे PNG के रूप में) के साथ एक छवि से भरी हुई है लगता है।

पारदर्शिता/अल्फा चैनल को नई छवि में स्थानांतरित करने के लिए मुझे DrawImage() कैसे मिल सकता है, और फिर जब मैं फ़ाइल को सहेजता हूं तो उन्हें रखें?

+0

प्रश्न यह है कि 'saveFormat' चर का मूल्य क्या है? यह 'PixelFormat.Format32bppArgb' होना चाहिए (या अल्फा चैनल के साथ एक और प्रारूप)। कोशिश भी करें: 'उपयोग (छवि dest = नई बिटमैप (चौड़ाई, ऊंचाई, PixelFormat.Format32bppArgb)) '। –

+0

यह अल्फा चैनलों के लिए काम करता प्रतीत होता है, लेकिन जीआईएफ पारदर्शिता के लिए नहीं। इनपुट फ़ाइल के प्रारूप के आधार पर 'saveFormat' अलग-अलग होगा। अगर इनपुट फ़ाइल अल्फा चैनल का समर्थन नहीं करती है, तो यह मानना ​​सुरक्षित है कि छवि में अल्फा चैनल पिक्सल नहीं होंगे। –

+0

तो, जीआईएफ फाइलों के लिए 'saveFormat' का मूल्य क्या है :)? –

उत्तर

22

यह बहुत अस्पष्ट है, आपने बहुत कुछ नहीं कहा है। पारदर्शिता के साथ सबसे बड़ा मुद्दा यह है कि आप इसे नहीं देख सकते हैं। आपने कुछ चरणों को छोड़ दिया है, आपने स्पष्ट रूप से अपने नए बिटमैप के पिक्सेल प्रारूप को निर्दिष्ट नहीं किया है, आपने इसे बिल्कुल प्रारंभ नहीं किया है और आपने यह नहीं कहा कि आप किस आउटपुट प्रारूप का उपयोग करते हैं। कुछ पारदर्शिता का समर्थन नहीं करते हैं। तो चलिए एक संस्करण बनाते हैं जो इसे क्रिस्टल स्पष्ट बनाता है। एक PNG छवि कि paint.net में इस तरह दिखता है से:

enter image description here

आप स्पष्ट रूप से देख सकते हैं:

enter image description here

इस छवि का उत्पादन इस कोड

 using (var src = new Bitmap("c:/temp/trans.png")) 
     using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
     using (var gr = Graphics.FromImage(bmp)) { 
      gr.Clear(Color.Blue); 
      gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
      bmp.Save("c:/temp/result.png", ImageFormat.Png); 
     } 

का उपयोग करना नीली पृष्ठभूमि इसलिए पारदर्शिता काम किया।

+1

खैर, मेरा इरादा इनपुट फ़ाइल से मेल खाने वाले किसी भी प्रारूप का समर्थन करना था। मैंने सोचा कि मैं बहुत विशिष्ट था। यह सिर्फ इतना है कि कोड केवल एक फ़ाइल प्रकार का समर्थन करने के लिए नहीं था। शायद मुझे प्रत्येक फ़ाइल प्रकार को संभालने के लिए कोड का एक गुच्छा चाहिए - मुझे नहीं पता। मैंने आपके जैसा पिक्सेलफॉर्मेट निर्दिष्ट करने का प्रयास किया था, लेकिन फिर ऐसा लगता था कि फ़ाइल प्रकार जीआईएफ पारदर्शिता के साथ त्रुटियों का कारण बन रहा था। और, वास्तव में, कुछ बदलाव PixelFormat निर्दिष्ट किए बिना पीएनजी के साथ ठीक काम करना प्रतीत होता था। –

+0

@ जोनाथनवुड पुरानी बिटमैप की चौड़ाई और ऊंचाई, और आपका नया वांछित प्रारूप के साथ एक नया बिटमैप बनाएं। पसंदीदा रूप से 'उपयोग' कथन में, ग्राफिक्स ऑब्जेक्ट 'FromImage ('आपका नया बिटमैप')' और 'DrawImage (' आपका पुराना बिटमैप') 'बनाएं। –

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