2011-03-19 20 views
7

Puedo cargar con éxito el siguiente mapa de bits como este y mostrarlo dentro de un control de imagen en la vista.Silverlight: BitmapImage to WriteableBitmap

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

Sin embargo, tan pronto como puedo añadir esta línea para crear un WriteableBitmap fuera del mapa de bits,

var w = new WriteableBitmap(bitmapImage); 

me sale un error de ejecución en la línea de arriba: "Referencia a objeto no establecida como instancia de un objeto."

Parece que la creación de BitmapImage está retrasada, ¿podría ser? ¿Cómo debo solucionar esto?

Actualización:

ahora estoy tratando esto, pero el openImage parece no ser golpeado. (incluso sin tratar de hacerlo sincrónico, todavía falla) ¿Qué está mal aquí?

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(); 

Gracias,

Respuesta

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

Ahhhhh es asincrónico. :) Muchas gracias por la ayuda! – Houman

+0

Hola Ai_boy, Desafortunadamente, el método ImageOpened nunca llega. Reconocí el afeitado del evento para suscribirme antes de que se establezca URi. Pero incluso eso no está funcionando. ¿Tienes alguna idea de por qué? ¿Esto funcionó para ti? Por favor revisa mi actualización en la publicación principal. – Houman

+0

editó una respuesta .. –

6

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

Básicamente, la imagen de mapa de bits tiene una propiedad de dependencia "CreateOptions" que, por defecto, se establece en "DelayCreation". Esto hace que el mapa de bits se demore para renderizar hasta que sea necesario. Por lo tanto, esto provoca nuestro error de "referencia de objeto no establecido en una instancia de un objeto". Para solucionar este problema, tenemos que romper la creación de mapa de bits fuera de la constructora WriteableBitmap, cambie esta opción, y luego volverlo a poner en vb.net En esto se parece a:.

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); 
    } 

Esto debería funcionar. ¡lo hizo por mí ...! Lo hace un poco complicado, ¡pero así es como funciona!

Cuestiones relacionadas