2009-06-24 29 views
8

Tôi đã xé tóc ra ngoài vấn đề này trong một giờ qua.ImageSourceConverter ném NullReferenceException ... tại sao?

Tôi có một số mã mà đi như thế này:

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

Khi tôi chạy mã của tôi, nó nói một NullReferenceException xảy ra. Cả 'Âm nhạc' lẫn sự trở lại của GetHbitmap() đều không có giá trị.

Tôi đang cố gắng tải hình ảnh qua Thuộc tính vì đó là cách duy nhất tôi đã tìm ra cách truy cập hình ảnh trong thư mục Tài nguyên của mình. Tôi chỉ cần thêm chúng vào tệp app.xaml dưới dạng tài nguyên, nhưng tôi không sử dụng tệp app.xaml vì một vài lý do.

Tôi có cố gắng thực hiện điều này không? Tất cả những gì tôi cần làm là lấy một đối tượng ImageSource của một hình ảnh mà tôi có trong thư mục Tài nguyên của mình. Tôi có thể sử dụng chúng tốt trong XAML của tôi, nhưng không thể cho cuộc sống của tôi làm điều đó trong bất kỳ mã nào.

P .: Tôi không thể thêm chúng dưới dạng tài nguyên vào tệp XAML vì đây chỉ là một lớp và do đó không có tệp XAML.

+0

Phải có một số thông tin bổ sung trong ngăn xếp ngoại lệ đầy đủ – moogs

+0

Bạn sẽ nghĩ rằng nhưng không có nghĩa đen là gì. Đây là những gì xuất phát từ 'Sao chép chi tiết ngoại lệ vào khay nhớ tạm': System.NullReferenceException được unhandled Message = Tham chiếu đối tượng không được đặt thành thể hiện của đối tượng. Source = PresentationCore StackTrace: tại System.Windows.Media.ImageSourceConverter.ConvertFrom (ITypeDescriptorContext bối cảnh, văn hóa CultureInfo, giá trị Object) tại System.ComponentModel.TypeConverter.ConvertFrom (Object value) tại coDrivr4.Conductor.PopulateDefaultApplicationTiles() trong ... InnerException: –

+0

Tôi cũng nên chỉ ra rằng tôi đang chạy VS2010 & .NET 4.0. Không chắc chắn lắm nếu điều đó tạo ra rất nhiều sự khác biệt, nhưng đây là phiên bản beta. –

Trả lời

5

Bạn có rất nhiều thứ mà có thể là không có trong đó. Tôi khuyên bạn nên tách chúng ra:

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

Lưu ý việc sử dụng diễn viên thay vì nhà điều hành as tại đây. Nếu sourcekhông phải là an ImageSource, điều này sẽ ném một số InvalidCastException sẽ mang tính mô tả hơn là chỉ kết thúc dưới dạng tham chiếu null.

EDIT: OK, vì vậy bây giờ chúng tôi biết chắc chắn rằng nó đang xảy ra trong ConvertFrom, tôi đề nghị bước tiếp theo là tìm hiểu xem đó là lỗi trong .NET 4.0 beta 1. Bạn có thực sự sử dụng bất kỳ tính năng .NET 4.0 nào không? Tôi đề nghị bạn cố gắng trích xuất chỉ một chút mã vào một dự án riêng biệt (bạn không cần phải hiển thị API, chỉ cần chuyển đổi hình ảnh. Hãy thử chạy mã đó trong .NET 3.5. Nếu nó không theo cùng một cách

+0

Đó không phải là một trong hai. Các lỗi tương tự ném vào dòng 'nguồn đối tượng = ...'. –

+0

Đúng - nhưng điều quan trọng là chúng tôi đã thiết lập rằng nó chắc chắn trong ConvertFrom. Phải thừa nhận rằng chúng tôi đã thấy rằng ngay lập tức từ dấu vết ngăn xếp ... –

+0

Vậy bước tiếp theo là gì? Tôi không có ý tưởng để kiểm tra những gì đang xảy ra ở thời điểm này. –

0

Hãy thử đặt giá trị trả lại là coDrivr4.Properties.Resources.Music.GetHbitmap() vào biến tạm thời và xem liệu biến đó có phải là không - đó có thể là nơi null của bạn đến.

+0

Nó chắc chắn không phải là vô giá trị, theo cả trình gỡ lỗi và kiểm tra trong mã nhanh của tôi. –

8

Tôi nhấn chính xác cùng một vấn đề - Tôi đã có tất cả các bitmap của tôi trong một tệp tài nguyên được nhập tĩnh, đẹp và tôi chỉ muốn đặt ImageSource với chúng . vì vậy, kể từ khi ImageSourceConverter được ném ngoại lệ tham chiếu null, tôi đã thay đổi chiến thuật và sử dụng đoạn mã này thay vì:.

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

Hy vọng rằng sẽ giúp

+1

Công trình này hoàn hảo. Các phương pháp ConvertFrom vẫn ném một NullReferenceException, ngay cả khi đối tượng tôi vượt qua không phải là null (tôi đôi kiểm tra với trình gỡ lỗi Visual Studio). – MrAsterisco

1

Trước khi sử dụng ConvertFrom lưu bitmap của bạn để MemoryStream

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

Đây không phải là một lỗi trong .NET Framework, ngoại lệ tham chiếu null này xảy ra vì ImageSourceConverter không thể chuyển đổi một đối tượng kiểu Bitmap, nó có thể chuyển đổi: Stream, chuỗi, Uri, byte [], vì vậy bạn phải thay đổi mã của bạn thành một cái gì đó như thế này:

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; 
} 
Các vấn đề liên quan