none
Cargar una imagen desde los recursos de la aplicación Visual Basic 2010 (WPF) RRS feed

  • Pregunta

  • Hola, necesito cargar mediante código [en Visual Basic 2010 (WPF)] (es decir; en tiempo de ejecución) en una imágen ya añadida: Image1, utilizando Image1.Source = ?? necesito cargar imágenes desde los recursos, las imágenes en los recursos están añadidos en Resources (según la vista de árbol) yo los añadí en Recursos>Imágenes, he probado de todo tipo de código y no consigo que funcione, por favor ayúdenme, muchas gracias y saludos.

    lunes, 23 de mayo de 2011 9:33

Respuestas

  • Hola David.

    No se que tipo de recursos quieres usar, de modo que te dejo 2 de los que creo que pueden ser:

    El primero consiste en añadir una imagen dentro del proyecto y establecer la accion de compilacion en 'Resource' de modo que la imagen se agrega como recurso en el ejecutable final.

    Si este es el caso, puedes hacer algo asi:

        ' BLOQUE DE CODIGO PARA CARGAR UNA IMAGEN DESDE UNA CARPETA DEL PROYECTO, ESTABLECIENDOLA COMO RECURSO EN ACCION DE COMPILACION
        ' opcion con la URL absoluta
        Dim uri As Uri = New Uri("pack://application:,,,/NombreProyecto-ensamblado;component/carpeta/imagen.jpg")
        ' opcion con la URL relativa
        Dim uri As Uri = New Uri("/carpeta/imagen.jpg", UriKind.Relative)
    
        Image1.Source = New BitmapImage(Uri)
    

    Y con esto ya estaria cargada, este modo es el mejor integrado con WPF y su sistema de recursos y diccionarios.

     

    Por otro lado, es posible que hables de los recursos .resx que se siguen manteniendo en WPF, pero en el caso de las imagenes no es tan sencilla su obtencion.

    Si tu imagen esta en uno de estos archivos de recursos, tienes que obtener su handle y usarlo para crear el bitmap haciendo uso del GDI de windows.

    De modo que puedes hacer algo asi:

        ' BLOQUE DE CODIGO PARA CARGAR UNA IMAGEN DESDE UN ARCHIVO DE RECURSOS 'RESX'
        Dim handle As IntPtr
    
        Try
          ' obtener de un archivo de recursos '.resx'
          handle = My.Resources.Resource1.NombreImagen.GetHbitmap()
          Image1.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions())
    
        Catch ex As Exception
    
        Finally
          DeleteObject(handle)
        End Try
    

    OJO, como haces uso de un handle del GDI de windows, debes de liberarlo explicitamente, por ello he añadido en la clausula Finally el metodo 'DeleteObject', que es una llamada a la funcion del GDI para liberar el recurso y la puedes definir asi:

      <System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")> _
      Private Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean
      End Function
    

     

    Bueno, supongo que alguno de estos 2 metodos te serviran, ya comentaras como te va

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    • Propuesto como respuesta Antonio Lobo lunes, 23 de mayo de 2011 21:55
    • Marcado como respuesta David-RR91 martes, 24 de mayo de 2011 7:28
    lunes, 23 de mayo de 2011 14:14

Todas las respuestas

  • Hola que tal aqui te dejo un ejemplo de como podrias utilizar tu imagen de los recursos


    Image finalImage = new Image();

    finalImage.Width = 80;

    BitmapImage logo = new BitmapImage();
    logo.BeginInit();
    logo.UriSource = new Uri("pack://application:,,,/ApplicationName;component/Resources/logo.png");
    logo.EndInit();

    finalImage.Source = logo;

     

    Saludos, cualquier cosa estamos a la orden!

    lunes, 23 de mayo de 2011 13:56
  • Hola David.

    No se que tipo de recursos quieres usar, de modo que te dejo 2 de los que creo que pueden ser:

    El primero consiste en añadir una imagen dentro del proyecto y establecer la accion de compilacion en 'Resource' de modo que la imagen se agrega como recurso en el ejecutable final.

    Si este es el caso, puedes hacer algo asi:

        ' BLOQUE DE CODIGO PARA CARGAR UNA IMAGEN DESDE UNA CARPETA DEL PROYECTO, ESTABLECIENDOLA COMO RECURSO EN ACCION DE COMPILACION
        ' opcion con la URL absoluta
        Dim uri As Uri = New Uri("pack://application:,,,/NombreProyecto-ensamblado;component/carpeta/imagen.jpg")
        ' opcion con la URL relativa
        Dim uri As Uri = New Uri("/carpeta/imagen.jpg", UriKind.Relative)
    
        Image1.Source = New BitmapImage(Uri)
    

    Y con esto ya estaria cargada, este modo es el mejor integrado con WPF y su sistema de recursos y diccionarios.

     

    Por otro lado, es posible que hables de los recursos .resx que se siguen manteniendo en WPF, pero en el caso de las imagenes no es tan sencilla su obtencion.

    Si tu imagen esta en uno de estos archivos de recursos, tienes que obtener su handle y usarlo para crear el bitmap haciendo uso del GDI de windows.

    De modo que puedes hacer algo asi:

        ' BLOQUE DE CODIGO PARA CARGAR UNA IMAGEN DESDE UN ARCHIVO DE RECURSOS 'RESX'
        Dim handle As IntPtr
    
        Try
          ' obtener de un archivo de recursos '.resx'
          handle = My.Resources.Resource1.NombreImagen.GetHbitmap()
          Image1.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions())
    
        Catch ex As Exception
    
        Finally
          DeleteObject(handle)
        End Try
    

    OJO, como haces uso de un handle del GDI de windows, debes de liberarlo explicitamente, por ello he añadido en la clausula Finally el metodo 'DeleteObject', que es una llamada a la funcion del GDI para liberar el recurso y la puedes definir asi:

      <System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")> _
      Private Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean
      End Function
    

     

    Bueno, supongo que alguno de estos 2 metodos te serviran, ya comentaras como te va

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    • Propuesto como respuesta Antonio Lobo lunes, 23 de mayo de 2011 21:55
    • Marcado como respuesta David-RR91 martes, 24 de mayo de 2011 7:28
    lunes, 23 de mayo de 2011 14:14
  • Muchísimas gracias, me sirve y me ha solucionado el problema, gracias :)

    Saludos.

    martes, 24 de mayo de 2011 7:28