2009-06-24 15 views
8

मैं इस मुद्दे पर पिछले घंटे या उससे भी ज्यादा समय तक अपने बालों को फाड़ रहा हूं।ImageSourceConverter एक NullReferenceException फेंकता है ... क्यों?

videoTile.Icon = new ImageSourceConverter().ConvertFrom(coDrivr4.Properties.Resources.Music.GetHbitmap()) as ImageSource; 

जब मैं अपने कोड चलाने के लिए, यह कहता है कि एक NullReferenceException हुई:

मैं कुछ कोड है कि इस तरह से चला जाता है की है। न तो 'संगीत' और न ही GetHbitmap() की वापसी शून्य है।

मैं गुणों के माध्यम से छवि प्राप्त करने की कोशिश कर रहा हूं क्योंकि यह एकमात्र तरीका है जिसे मैंने अपने संसाधन फ़ोल्डर में छवियों तक पहुंचने का तरीका बताया है। मैं उन्हें संसाधन के रूप में app.xaml फ़ाइल में जोड़ दूंगा, लेकिन मैं कुछ कारणों से app.xaml फ़ाइल का उपयोग नहीं कर रहा हूं।

क्या मैं यह गलत करने का प्रयास कर रहा हूं? मुझे बस अपनी संसाधन निर्देशिका में एक छवि का इमेजसोर्स ऑब्जेक्ट प्राप्त करना है। मैं उन्हें अपने एक्सएएमएल में बस ठीक कर सकता हूं, लेकिन मेरे जीवन के लिए किसी भी कोड में ऐसा नहीं कर सकता।

पीएस .: मैं उन्हें एक्सएएमएल फ़ाइल में संसाधन के रूप में नहीं जोड़ सकता क्योंकि यह सिर्फ एक वर्ग है और इसलिए कोई एक्सएएमएल फ़ाइल नहीं है।

+0

पूर्ण अपवाद स्टैक – moogs

+0

में कुछ अतिरिक्त जानकारी होनी चाहिए, लेकिन आपको सचमुच कुछ भी नहीं होगा। यह 'क्लिपबोर्ड पर अपवाद विवरण कॉपी करें' से बाहर आता है: सिस्टम.NullReferenceException को अनचाहे संदेश = ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं है। स्रोत = PresentationCore StackTrace: System.Windows.Media.ImageSourceConverter.ConvertFrom (ITypeDescriptorContext संदर्भ, CultureInfo संस्कृति, वस्तु मूल्य) पर System.ComponentModel.TypeConverter.ConvertFrom पर (वस्तु मूल्य) coDrivr4.Conductor.PopulateDefaultApplicationTiles पर () में ... इनर एक्सेप्शन: –

+0

मुझे यह भी इंगित करना चाहिए कि मैं वीएस -2010 और .NET 4.0 चला रहा हूं। बहुत यकीन नहीं है कि अगर यह बहुत अंतर बनाता है, लेकिन हे, यह बीटा है। –

उत्तर

5

अच्छी तरह से आपके पास बहुत सी चीजें हैं जो वहां शून्य हो सकती हैं। मेरा सुझाव है कि आप उन्हें अलग:

Bitmap bitmap = coDrivr4.Properties.Resources.Music; 
object source = new ImageSourceConverter().ConvertFrom(bitmap.GetHbitmap()); 
ImageSource imageSource = (ImageSource) source; 
videoTile.Icon = imageSource; 

नोट एक डाली बजाय as ऑपरेटर यहाँ का उपयोग। यदि sourceImageSource नहीं है, तो यह InvalidCastException फेंक देगा जो कि शून्य संदर्भ के रूप में समाप्त होने से कहीं अधिक वर्णनात्मक होगा।

संपादित करें: ठीक है, तो अब हम यकीन है कि यह ConvertFrom में हो रहा है के लिए पता है, मैं सुझाव है कि अगले कदम पता लगाने के लिए कि क्या यह .NET 4.0 बीटा 1 में एक बग आप वास्तव में किसी भी .NET 4.0 सुविधाओं का उपयोग कर रहे है? मेरा सुझाव है कि आप को एक अलग प्रोजेक्ट में कोड कोड को निकालने का प्रयास करें (आपको एक एपीआई प्रदर्शित करने की आवश्यकता नहीं है, बस छवि को कन्वर्ट करें। उस कोड को .NET 3.5 में चलाने का प्रयास करें। यदि यह उसी तरह विफल रहता है , जिसने बीटा-नेस को संभावित समस्याओं की सूची से हटा दिया है।

+0

यह या तो नहीं है। वही त्रुटि 'ऑब्जेक्ट स्रोत = ...' लाइन पर फेंकता है। –

+0

सही - लेकिन महत्वपूर्ण बात यह है कि हमने यह पाया है कि यह निश्चित रूप से ConvertFrom में है। माना जाता है कि हम तुरंत स्टैक ट्रेस से देख चुके होंगे ... –

+0

तो अगला कदम क्या है? मैं इस बिंदु पर क्या गलत हो रहा है यह जांचने के लिए विचारों से बाहर हूं। –

0

coDrivr4.Properties.Resources.Music.GetHbitmap() के वापसी मूल्य को एक अस्थायी चर में डालने का प्रयास करें और देखें कि यह शून्य है - यह वह जगह हो सकती है जहां से आपकी नल आ रही है।

+0

डीबगर और मेरे त्वरित इन-कोड परीक्षण दोनों के अनुसार यह निश्चित रूप से शून्य नहीं है। –

8

मैंने बिल्कुल वही समस्या मारा - मुझे अपने सभी बिटमैप्स को एक अच्छी, स्थैतिक रूप से टाइप की गई संसाधन फ़ाइल में मिला है और मैं बस उनके साथ एक छवि स्रोत सेट करना चाहता हूं । तो, के बाद से ImageSourceConverter अशक्त संदर्भ अपवाद फेंक रहा था, मैं कील बदल गया है और बजाय कोड के इस टुकड़े का प्रयोग किया:।

Bitmap bitmap = entityCol.EntityCollectionImage; 
this.Image = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); // Image is an image source 

आशा है कि मदद करता है

+1

यह बेकार ढंग से काम करता है। ConvertFrom विधि अभी भी एक NullReferenceException फेंकता है, भले ही मैं जिस वस्तु को पास करता हूं वह शून्य नहीं है (मैं विजुअल स्टूडियो डीबगर के साथ दोबारा जांच करता हूं)। – MrAsterisco

1

उपयोग करने से पहले ConvertFrom बचाने के अपने बिटमैप

Bitmap canvas = new Bitmap(secScreen.Bounds.Width, secScreen.Bounds.Height); 
Graphics g = Graphics.FromImage(canvas); 
g.Clear(System.Drawing.Color.Yellow); 

MemoryStream stream = new MemoryStream(); 
canvas.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
ImageSource isrg = (ImageSource)new ImageSourceConverter().ConvertFrom(stream); 
1

MemoryStream करने के लिए यह .NET फ्रेमवर्क में एक बग नहीं है, यह अशक्त संदर्भ अपवाद होती है क्योंकि ImageSourceConverter एक बिटमैप प्रकार वस्तु है, यह कन्वर्ट करने के लिए कर सकते हैं परिवर्तित नहीं कर सकते: स्ट्रीम, स्ट्रिंग, उरी, बाइट [] है, तो आप कुछ इस तरह करने के लिए अपने कोड बदलने के लिए:

var imageSourceConverter = new ImageSourceConverter(); 
byte[] tempBitmap = BitmapToByte(eventArgs.Frame); 
ImageSource image = (ImageSource)imageSourceConverter.ConvertFrom(tempBitmap); 

...

private byte[] BitmapToByte(Bitmap bitmap) 
{ 
    byte[] byteArray; 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); 
     stream.Close(); 

     byteArray = stream.ToArray(); 
    } 
    return byteArray; 
} 
संबंधित मुद्दे