2009-06-15 11 views
8

मैं क्लिपबोर्ड से एक की नकल की छवि को बचाने के लिए कोशिश कर रहा हूँ, लेकिन यह अपने अल्फ़ा चैनल खोने है: मैं फोटोशॉप या आईई/फ़ायरफ़ॉक्स/क्रोम से एक 32bit चित्र को कॉपी और इसके बाद के संस्करण कोड चलाते हैंमैं .NET में अल्फा चैनल खोए बिना क्लिपबोर्ड से छवि कैसे प्राप्त कर सकता हूं?

Image clipboardImage = Clipboard.GetImage(); 
string imagePath = Path.GetTempFileName(); 
clipboardImage.Save(imagePath); 

, उत्पादन इसके अल्फा चैनल को खो देता है, इसके बजाय यह एक काले रंग की पृष्ठभूमि के खिलाफ बचाया जाता है।

छवि पीएनजी के रूप में सहेजी गई है, जिसमें अल्फा चैनल हो सकता है।

क्लिपबोर्ड में सही डेटा दिखाई देता है क्योंकि अन्य अनुप्रयोगों (जैसे फोटोशॉप) में पेस्ट करना अल्फा चैनल को बरकरार रखता है।

क्या कोई मुझे मेरे दुख से बाहर कर सकता है?

अग्रिम धन्यवाद!

अद्यतन:

// outputs FALSE 
Debug.WriteLine(Image.IsAlphaPixelFormat(Clipboard.GetImage().PixelFormat)); 

ऊपर चलता है कि अल्फा डेटा जैसे ही यह क्लिपबोर्ड से बाहर ले जाया गया है खो दिया है। शायद मुझे इसे किसी अन्य तरीके से क्लिपबोर्ड से बाहर निकालना होगा?

+3

+1 इसके उचित उपयोग के लिए और इसके – Kevin

+0

अच्छे प्रश्न के लिए। यदि आपने हल किया है, तो शायद आप अपने प्रश्न को एक कामकाजी कोड के साथ अपडेट करना चाहते हैं, कृपया? – Nasenbaer

उत्तर

7

इसके बजाय इस कोड का उपयोग, Clipboard.GetDataObject()

यह एक IDataObject, रिटर्न से कॉल करके जो आप dataObject.GetFormats() पर कॉल करके क्वेरी चालू कर सकते हैं। GetFormats() क्लिपबोर्ड ऑब्जेक्ट द्वारा समर्थित प्रकार के प्रारूप लौटाता है - एक अधिक सटीक प्रारूप समर्थित हो सकता है जिसका उपयोग आप डेटा निकालने के लिए कर सकते हैं।

+3

यह है सबसे संभावित समाधान। क्लिपबोर्ड पर जेनेरिक छवि प्रारूप के साथ 2 दशकों की पिछली संगतता का सामना करना पड़ता है। यह लगभग निश्चित है कि विंडोज़ जानबूझकर किसी भी 32 बिट छवि को 24 बिट तक परिवर्तित कर देता है जब सीएफबीआईटीएमएपी प्रारूप में अनुरोध किया जाता है। – David

+1

मैंने क्लिपबोर्ड को छुआ नहीं है एक लंबा समय, लेकिन एमएसडीएन की जांच करना यह उस विशिष्ट प्रारूप की तरह दिखता है जिसे आप CF_DIBV5 के लिए जांचना चाहते हैं, जो विस्तारित रंग की जानकारी वाली छवियों के लिए प्रारूप है (अल्फा चैनल, प्रति रंग 8 बिट्स, आदि) – David

+0

ऐसा लगता है कि समस्या बहुत अधिक है मैंने सोचा जितना जटिल, और जब मैंने कहा कि मैं ब्राउज़र से छवियों की प्रतिलिपि बना सकता हूं तो मुझे गलत लगा फोटोशॉप के लिए और पारदर्शिता बनाए रखें। मैं फोटोशॉप के भीतर प्रतिलिपि बना सकता हूं, लेकिन मुझे लगता है कि यह छवि डेटा की बजाय क्लिपबोर्ड पर परत का संदर्भ संग्रहीत कर रहा है। "एडोब फोटोशॉप छवि" GetFormats द्वारा दिए गए प्रारूपों में से एक है, लेकिन जब मैं कोशिश करता हूं और इस डेटा को पढ़ता हूं तो मैं बस शून्य हो जाता हूं। सभी मदद के लिए बहुत धन्यवाद! –

0

छवि एक बिटमैप जहां पारदर्शी पिक्सेल क्लिपबोर्ड पर दिखाई दे रहे हैं के रूप में सहेजा जा रहा है तो Clipboard.GetImage() बुलाने की

Bitmap clipboardImage = Clipboard.GetImage(); 
clipboardImage.MakeTransparent() 
string imagePath = Path.GetTempFileName(); 
clipboardImage.Save(imagePath); 
+0

MakeTransparent केवल एक ही रंग पारदर्शी बना देगा, उस पंक्ति से पहले अल्फा जानकारी खो जाती है :( –

+0

मुझे पता है कि यह ठीक से काम करता है जब मैंने अपने प्रोग्राम में फ़ायरफ़ॉक्स से एक छवि कॉपी की है, लेकिन मुझे लगता है कि उसने ड्रॉप छाया को कॉपी नहीं किया – Jim

3

यह this article जैसा हो सकता है, यह सुझाव देता है कि क्लिपबोर्ड ऑब्जेक्ट, Win32 के भीतर काम कर रहा है, केवल बिटमैप्स प्रबंधित करने में सक्षम है, जिसमें पारदर्शी/आंशिक पारदर्शी अल्फा चैनल नहीं है। OLE क्लिपबोर्ड और अधिक सक्षम, ऐसा लगता है है:

हालांकि, netez सबसे अच्छा लेख मैं विषय पर पाया गया था। (सावधान रहें मैंने इसे स्वयं परीक्षण नहीं किया है)

0

मैं सिर्फ फॉर्म मेथोड का उपयोग कर रहा हूं। केविन की तरह GetFormat का उपयोग करने का अच्छा समाधान नहीं है, लेकिन यह और अधिक तेज़ और काम करता है।

'Dim bm As BitmapSource = Clipboard.GetImage()'looses alpha channel 
       'Dim bmS As New WriteableBitmap(bm)'does work but still without alpha information 
       Dim bmF As System.Drawing.Bitmap = System.Windows.Forms.Clipboard.GetImage 'Get working image 
       Dim bmS As BitmapSource = TB.Imaging.WPF.BitmapToWpfBitmapSource(bmF, Me) 'convert Bitmap into BitmapSource 
       Me.Source = bmS 
संबंधित मुद्दे