2011-03-19 21 views
7

Aşağıdaki Bitmap'i bu şekilde başarıyla yükleyebilir ve görünümde bir Görüntü denetimi içinde görüntüleyebilirim.Silverlight: BitmapImage to WriteableBitmap

var bitmapImage = new BitmapImage 
          { 
           UriSource = 
            new Uri("../Images/Test.JPG", UriKind.Relative) 
          }; 

Ancak en kısa zamanda bitmap dışında bir WriteableBitmap oluşturmak için bu çizgiyi,

var w = new WriteableBitmap(bitmapImage); 

Yukarıda hattında bir çalışma zamanı hatası alıyorum eklemek gibidir: örneğine ayarlanmadı "Nesne referansı bir obje."

BitmapImage oluşturma gecikmeli görünüyor, öyle olabilir mi? Bunu nasıl düzeltmeliyim?

Güncelleme:

Şimdi bu çalışıyorum ama openImage vurulma asla görünüyor. (senkronize yapmaya bile çalışmasa bile, hala başarısız oluyor) Burada sorun nedir?

var image = new BitmapImage(); 
     image.ImageOpened += (sender, args) => resetEventBitmap.Set(); 
     image.ImageFailed += (o, eventArgs) => 
           { 
            resetEventBitmap.Set(); 
            throw eventArgs.ErrorException; 
           }; 
     image.CreateOptions = BitmapCreateOptions.IgnoreImageCache; 
     image.UriSource = uri; 

     resetEventBitmap.WaitOne(); 

sayesinde

cevap

3
BitmapImage _classField; 

    void LoadImageFunction() 
    { 
     _classField = new BitmapImage(); 
     _classField.ImageOpened += new EventHandler<RoutedEventArgs>(bi_ImageOpened); 
     _classField.ImageFailed += new EventHandler<ExceptionRoutedEventArgs>(bi_ImageFailed); 
     //sorry.. totally forgot about order :) 
     _classField.UriSource = new Uri("../some/uri", UriKind.Relative); 
    } 

    void bi_ImageFailed(object sender, ExceptionRoutedEventArgs e) 
    { 
     //something has happend 
     throw e.ErrorException; 
    } 

    void bi_ImageOpened(object sender, RoutedEventArgs e) 
    { 
     //image is loaded.. now we can work with it.. 
     var w = new WriteableBitmap(_classField); 
    } 
+0

Eşzamansız Ahhhhh. :) Yardımlarınız için çok teşekkür ederim! – Houman

+0

Merhaba Ai_boy, Ne yazık ki ImageOpened yöntemi asla vurmuyor. URi ayarlanmadan önce abone olmak için olayı tıraşladım. Ama bu bile çalışmıyor. neden olduğu hakkında bir fikrin var mı? Bu senin için mi çalıştı? Lütfen güncellememi ana gönderide kontrol edin. – Houman

+0

bir cevabı düzenledi .. –

6

Referans: http://www.blog.ingenuitynow.net/Silverlight+Creating+A+WriteableBitmap+From+A+Uri+Source.aspx

Temelde, bitmap görüntü varsayılan olarak, "DelayCreation" olarak ayarlandığında, "CreateOptions" bir bağımlılık özelliği vardır. Bu, bitmap'in gerekene kadar işleme için geciktirilmesine neden olur. Bu nedenle, "nesne başvurusu bir nesnenin örneğine ayarlanmadı" hatasına neden olur. Bunu düzeltmek için, biz, writeablebitmap yapıcı dışına bitmap oluşturulmasını kırmak bu seçeneği değiştirin ve sonra onu geri koymak zorunda vb.net olarak şuna benzer:.

Dim tmpUri As New Uri(yourpath.ToString) 
    Dim bmp As New BitmapImage 
    bmp.CreateOptions = BitmapCreateOptions.None 
    bmp.UriSource = tmpUri 
    Dim wb As New WriteableBitmap(bmp) 
1
img1 = new BitmapImage(new Uri("/PrjName;component/Images/image01.jpg", UriKind.RelativeOrAbsolute)); 
     img2 = new BitmapImage(new Uri("/PrjName;component/Images/image02.jpg", UriKind.RelativeOrAbsolute)); 
     img1.CreateOptions = BitmapCreateOptions.None; 
     img2.CreateOptions = BitmapCreateOptions.None; 
     img1.ImageOpened += new EventHandler<RoutedEventArgs>(img1_ImageOpened); 
     img2.ImageOpened += new EventHandler<RoutedEventArgs>(img2_ImageOpened); 


    void img2_ImageOpened(object sender, RoutedEventArgs e) 
    { 
     load2 = true; 
    } 

    void img1_ImageOpened(object sender, RoutedEventArgs e) 
    { 
     load1 = true; 
    } 

    private void LayoutRoot_Loaded(object sender, RoutedEventArgs e) 
    { 
     while (!load1 && !load2) 
     { } 
     WriteableBitmap x = new WriteableBitmap(img1); 
     WriteableBitmap y = new WriteableBitmap(img2); 
    } 

Bu çalışması gerekir. Benim için yaptı ..! Bu bir lil 'karmaşık hale getirir, ama işte böyle!

İlgili konular