2009-05-13 15 views
34

Mi ensamblaje incluye una imagen con BuildAction == Resource. Quiero obtener una BitmapImage desde este recurso incrustado.¿Cómo puedo obtener una imagen de mapa de bits de un recurso?

puedo cargar un archivo BitmapImage de la siguiente manera:

var bitmap = new BitmapImage(new Uri(path)); 

Pero, ¿cómo puedo crear un URI que se referirá a una imagen recurso incrustado?

Cuando intento y crear una (por ejemplo pack://application:,,,/MyImage.png o pack://application:,,,/MyAssembly;component/MyImage.png), se produce una excepción 'pack URI':

System.UriFormatException "URI no válido: se esperaba un puerto debido a que hay dos puntos (':') presente pero el puerto no pudo ser analizado. "

he encontrado la solución, a la UriFormatException en este blog post

Sin embargo, con ese corrección aplicada, todavía consigo excepciones tratando de cargar un BitmapImage de un paquete URI.

Al usar el formato pack://application:,,,/Image.png, obtengo una NullReferenceException, y cuando utilizo el formato pack://application:,,,/AssemblyName;component/Image.png, recibo una excepción NotSupportedException "No se reconoce el prefijo Uri".


Resumen Mi problema era que yo estaba tratando de usar un 'paquete de URI' en un proceso antes de que se había creado una instancia ningún control WPF/ventana/etc, por lo que el esquema de 'pack' URI no estaba todavía registrado (otras "cosas" requeridas por WPF tampoco deben configurarse, porque el registro manual del esquema de paquete no soluciona el problema). La solución fue esperar hasta después de instanciar mi usercontrol de WPF para usar los URI del paquete.

+1

Gracias por su resumen del problema. Tengo el mismo problema y trataré de solucionarlo como sugieres. – Oskar

+0

posible duplicado de [Cargando BitmapImage en el código] (http://stackoverflow.com/questions/801833/loading-bitmapimage-in-code) –

Respuesta

20

This MSDN page tiene toda la información que quizás desee saber sobre los URI de recursos en WPF (a menudo llamados URI de paquete). Si lo desea, puede utilizar URI relativos más a menudo, por lo que consulte Tabla 4, que debe ser de un uso particular.

Si desea obtener una descripción más breve de URI de recursos (paquete), consulte this blog post. Esto demuestra que la sintaxis es de hecho relativamente simple:

pack://application:,,,/ResourceFile.xaml 

pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml 

Sin embargo, hay algunas peculiaridades de trabajar a cabo (en mi experiencia), por lo que a menudo encontrar el recurso correcto URI requiere un poco de experimentación.

+1

@mackenir: ¿Alguna vez consideró que la URL que publicó en su * edited * pregunta aún no había aparecido en el momento en que escribí mi respuesta. La grosería no te va a dar una buena respuesta. – Noldorin

+1

¡Lo siento! Olvidé que había editado la pregunta, lo creas o no. – mackenir

+1

@mackenir: No se preocupe, en ese caso. ¿Intentó simplemente usar un URI relativo, aa, que se muestra en la Tabla 4 en la página de MSDN? Puede que tengas más suerte con eso ... – Noldorin

Cuestiones relacionadas