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