martes, 11 de enero de 2011

Cargar imágenes en WPF de forma dinamica.

Ya tenia tiempo sin poner nada por falta de tiempo...

Como dice me enfrente a un pequeño problema al intentar cargar un stream directamente sobre un componente System.Windows.Controls.Image al invocar al propiedad Source se requiere un objeto ImageSource, investigando y haciendo pruebas descubri que igual puede usarse un elemento System.Windows.Media.Imaging.BitmapImage, el problema y radicaba en como crear el BitmapImage desde WPF.

Generalmente para trabajar con imágenes windows forms se utiliza un picturebox para el cual   se utiliza System.Windows.Forms.PictureBox.Image el cual es un objeto: System.Drawing.Image para cargar este existen miles de ejemplos en Internet y funciones nativas como System.Drawing.Image.FromFile()System.Drawing.Image.FromStream() los cuales nos facilitan la vida; pues bien me di a la tarea de buscar una solución.

La solución que deduje  en base a códigos y referencias que vi es la siguiente diseñe una función que recibe un objeto de tipo System.Drawing.Imag y devuelve el requerido System.Windows.Media.Imaging.BitmapImage el cual se puede cargar de forma dinámica en el objeto System.Windows.Controls.Imag de WPF.

EJEMPLO:
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            image1.Source = FromStream(System.Drawing.Image.FromFile(@"C:\....\Pictures\666666.jpg"));
            
        }

Lo cual invoca mi solución a groso modo:
        public BitmapImage FromStream(System.Drawing.Image Imagen)
        {
            BitmapImage bmp = new BitmapImage();
            var image = Imagen;
            bmp.BeginInit();
            MemoryStream memoryStream = new MemoryStream();
            image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
            memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
            bmp.StreamSource = memoryStream;
            bmp.EndInit();
            return bmp;
        }
Por cierto es necesario agregar las librerias :

using System.Windows.Forms;
using System.IO;
using System.Drawing;
Agregalas tanto en referencia como en el .CS de tu ventana WPF.

Tambien puede usuarse:

image.Source = new BitmapImage(
          new Uri(@"pack://application:,,,/MyReferencedAssembly/images/Globe.png",
                  UriKind.RelativeOrAbsolute));

2 comentarios:

  1. Buenas, estaba leyendo su blog y esta excelente, me gustaria saber si en WPF hay alguna forma de pasar imagenes en 2 formas: 1) Por tiempo, que las imagenes se pasen por ejemplo cada 5 o 10 segundos 2) Que exista una forma en que se pueda pasar ya sea por medio de una flecha o con la mano de ser touch.
    Muchas gracias

    ResponderEliminar
  2. aqui dejo una sencilla

    BoxImage.Source="https://sitioweb.com/img/imagen.png"

    funciona igual para archivos de tu equipo local.

    ResponderEliminar