none
Insertar un tipo de imagen a una aplicacion RRS feed

  • Pregunta

  • Buenos días,

    Estoy trabajando una aplicacion UWP , SQL Server Azure, WCF service, pero no se como traer un tipo de dato imagen a mi aplicacion.

    La aplicación la estoy trabajando con C#.

    Ya he seleccionado varios tipos de datos desde el servicio he declarado las clases y el tipo de dato así public byte[] IMAGENES { get; set; } trato de enviarlo a mi aplicación, me da error no se si sera por que tengo en sql server azure definido como image he buscado información sobre el tema en cuanto al trato de imágenes de una base de datos sql server azure y una aplicación UWP.

    Gracias por toda su colaboración.

    viernes, 20 de mayo de 2016 15:33

Respuestas

  • Hola javier bellido,

    Vamos a concentrarnos en la clase [ClaseBusquedaImagen] que comparte:

    public class ClaseBusquedaImage
        {
            public string APELLIDO_NOMBRE { get; set; }
    
            public byte IMAGENES { get; set; }
        }

    La propiedad IMAGENES no puede ser del tipo byte, no si lo que desea es que esa propiedad contenga la representación en bytes de una imagen. Un byte es un tipo entero de 8 bits y en ese tipo no es posible contener la representación de una imagen, así que lo primero que sugiero hacer es cambiar el tipo de la propiedad de byte a un array de bytes

    public class ClaseBusquedaImage
        {
            public string APELLIDO_NOMBRE { get; set; }
    
            public byte[] IMAGENES { get; set; }
        }

    Por otro lado, recorre un objeto de tipo SqlDataReader y recupera la imagen utilizando el método GetByte(), ya le había platicado lo que representa un tipo byte y como deducirá no vamos por el camino correcto.

    IMAGENES =  (byte[])dr["IMAGENES"]}

    Como verá, recuperamos el valor de la columna [IMAGENES] y convertimos a un array de bytes que precisamente es del mismo tipo de la propiedad IMAGENES.

    • Propuesto como respuesta José De Alva domingo, 22 de mayo de 2016 0:12
    • Marcado como respuesta José De Alva lunes, 23 de mayo de 2016 20:16
    sábado, 21 de mayo de 2016 15:21
  • javier bellido,

    Yo si creo que está obteniendo excepciones, sucede que "habilmente" usted las está "solapando", fíjese:

    catch (Exception a)
    	  {
    	  }

    ¿Qué objetivo tiene el bloque catch? En caso ocurra alguna excepción en el bloque try el flujo ingresará al bloque catch donde no se realiza nada, el programa proseguirá sin dar advertencia de que algo ha sucedido. Sospecho que debe obtener una excepción porque la clase ClaseBusquedaImagen tiene la propiedad APELLIDO_NOMBRE a la que no se asigna ningún valor, permitame modificar su código:

    public ObservableCollection<ClaseBusquedaImage> GetBuscarImagenes(string CodigoColaborador)
    {                  
    	ObservableCollection<ClaseBusquedaImage> DevolviendoImagen = new ObservableCollection<ClaseBusquedaImage>();
    	
    	string connectionString = "CADENA DE CONEXION ";
    	
    	try
    	{
    		using (SqlConnection cn = new SqlConnection(connectionStrin))
    		{		
    			cn.Open();
    			
    			string consultaSQL = "SELECT NOMBRE_APELLIDOS, IMAGENES FROM COLABORADOR WHERE (NUMERO = @NUMERO);
    			SqlCommand cmd = new SqlCommand(consultaSQL, cn);
    			
    			cmd.Parameters.AddWithValue("@NUMERO", CodigoColaborador);
    			
    			SqlDataReader dr = cmd.ExecuteReader();
    			while (dr.Read())
    			{
    				DevolviendoImagen.Add(new ClaseBusquedaImage() { NOMBRE_APELLIDO = dr.GetString(0), IMAGENES =  (byte[])dr["IMAGENES"]});
    			}
    		}
    	}
    	catch(Exception e)
    	{                
    		/*Mande un mensaje conteniendo e.Message*/		
    	}
    	
    	return DevolviendoImagen;
    }



    Bajo su entorno de desarrollo no estoy seguro la manera de mostrar un mensaje de error (algo como MessageBox.Show("Mensaje")) que funciona para WindowsForm, la idea es que en caso entre el flujo al bloque catch nos muestre el mensaje de error que se está produciendo (e.Message).

    Comentenos como le fue.


    sábado, 21 de mayo de 2016 17:38
  • Bueno gracias a todos los que me colaboraron pude resolver mi situacion este es el codigo final que me sirvio para transformar la imagen de Byte a FOTO.source

    ToDoServiceWeb.Service1Client IMAGENES = new ToDoServiceWeb.Service1Client();
                ToDoListIMAGEN = IMAGENES.GetBuscarImagenesAsync(this.CODIGOCOLABORADOR.Text).Result;
                int ia1;
                ia1 = ToDoListIMAGEN.Count;
                for (int abc = 0; abc < ia1; abc++)
                {
                    ToDoServiceWeb.ClaseBusquedaImage member = ToDoListIMAGEN[abc];
                    InMemoryRandomAccessStream raStream = new InMemoryRandomAccessStream();
                    {
                        DataWriter writer = new DataWriter(raStream);
                        {
                            writer.WriteBytes(member.IMAGENES);
                            await writer.StoreAsync();
                            await writer.FlushAsync();
                            writer.DetachStream();
                        }
                        raStream.Seek(0);
                        BitmapImage bitMapImage = new BitmapImage();
                        bitMapImage.SetSource(raStream);
                        FOTO.Source = bitMapImage;
                    }
                }
                IMAGENES.CloseAsync();

    asi quedo mi pequeña aplicacion 

    http://subefotos.com/ver/?64d00e6c48e9130b08079d67e4c9f7c3o.png#codigos

    Muchas Gracias.....

    • Marcado como respuesta José De Alva lunes, 23 de mayo de 2016 20:16
    lunes, 23 de mayo de 2016 19:33

Todas las respuestas

  • Hola Andres Infante

    Gracias por consultar en los foros. ¿Que tipo o mensaje de error estás recibiendo? Comparte el mensaje de error que estás recibiendo para tener mejor referencia, permiteme preguntarte ¿experimentas el mismo tipo de problema en tu desarrollo local y solo falla al intentar obtener los datos desde Azure? Con esta información nos das una perspectiva más clara del error. Estoy atento a tus comentarios.


    Saludos
    José
    __________________________________________________________________________________________
    Por favor, recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, hace que sea más fácil para los otros visitantes encontrar la solución más tarde. Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft. Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.



    viernes, 20 de mayo de 2016 16:24
  • Si posteas el error para que podamos apoyarte, una pregunta, la imagen la estas guardando dentro de tu Base de Datos o en tu sistema de archivos (y guardas la ruta en una tabla de SQL Server).

    Saludos.


    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    sábado, 21 de mayo de 2016 9:31
  • Si posteas el error para que podamos apoyarte, una pregunta, la imagen la estas guardando dentro de tu Base de Datos o en tu sistema de archivos (y guardas la ruta en una tabla de SQL Server).

    Saludos.


    No me manda error el codigo, la imagen la tengo almacenada en una base de datos windows sql azure yo utlizo un WCF para enviar los datos al UWP pero no los envia este es mi codigo

       public ObservableCollection<ClaseBusquedaImage> GetBuscarImagenes(string CodigoColaborador)
            {                  
                ObservableCollection<ClaseBusquedaImage> DevolviendoImagen = new                 ObservableCollection<ClaseBusquedaImage>();
                string connectionString = "CADENA DE CONEXION ";
                SqlConnection conn = new SqlConnection();
                 try
                  {conn.ConnectionString = connectionString;
                   conn.Open();
                   SqlCommand cmd = new SqlCommand();
                   cmd.Connection = conn;
                   string cmdText = "select IMAGENES from COLABORADOR where NUMERO = '" + (CodigoColaborador).Trim() + "'";
                   cmd.CommandText = cmdText;
                   cmd.CommandType = CommandType.Text;
                   SqlDataReader dr = cmd.ExecuteReader();
                      while (dr.Read())
                        {DevolviendoImagen.Add(new ClaseBusquedaImage() { IMAGENES =  dr.GetByte(0)});
                        }
                  }
                catch (Exception a)
                  {
                  }
                finally
                  {if (conn.State != ConnectionState.Closed)
                      {conn.Close();
                      }
                  }
                return DevolviendoImagen;
            }
    

    Y dentro del WCF tengo declarada el tipo de dato de esta manera

    public class ClaseBusquedaImage { public string APELLIDO_NOMBRE { get; set; } public byte IMAGENES { get; set; } }


    Ya he utilizado este codigo para distintos tipos de datos y me ha funcionado pero no he podido ulilizarlo para imagenes y no hay mucha informacion sobre el tema en internet Gracias de antemano por la ayuda....

    • Editado José De Alva domingo, 22 de mayo de 2016 0:08 correccion en bloque de cita y codigo
    sábado, 21 de mayo de 2016 13:11
  • Hola javier bellido,

    Vamos a concentrarnos en la clase [ClaseBusquedaImagen] que comparte:

    public class ClaseBusquedaImage
        {
            public string APELLIDO_NOMBRE { get; set; }
    
            public byte IMAGENES { get; set; }
        }

    La propiedad IMAGENES no puede ser del tipo byte, no si lo que desea es que esa propiedad contenga la representación en bytes de una imagen. Un byte es un tipo entero de 8 bits y en ese tipo no es posible contener la representación de una imagen, así que lo primero que sugiero hacer es cambiar el tipo de la propiedad de byte a un array de bytes

    public class ClaseBusquedaImage
        {
            public string APELLIDO_NOMBRE { get; set; }
    
            public byte[] IMAGENES { get; set; }
        }

    Por otro lado, recorre un objeto de tipo SqlDataReader y recupera la imagen utilizando el método GetByte(), ya le había platicado lo que representa un tipo byte y como deducirá no vamos por el camino correcto.

    IMAGENES =  (byte[])dr["IMAGENES"]}

    Como verá, recuperamos el valor de la columna [IMAGENES] y convertimos a un array de bytes que precisamente es del mismo tipo de la propiedad IMAGENES.

    • Propuesto como respuesta José De Alva domingo, 22 de mayo de 2016 0:12
    • Marcado como respuesta José De Alva lunes, 23 de mayo de 2016 20:16
    sábado, 21 de mayo de 2016 15:21
  • Hola Willians Morales Ya hice los cambios que me recomendo en la clase

        public class ClaseBusquedaImage
        {
            public string APELLIDO_NOMBRE { get; set; }
    
            public byte[] IMAGENES { get; set; }
        }
    
    y en el WCF
    
     public ObservableCollection<ClaseBusquedaImage> GetBuscarImagenes(string CodigoColaborador)
            {                  
                ObservableCollection<ClaseBusquedaImage> DevolviendoImagen = new ObservableCollection<ClaseBusquedaImage>();
                string connectionString = "CADENA DE CONEXION ";
                SqlConnection conn = new SqlConnection();
                 try
                  {conn.ConnectionString = connectionString;
                   conn.Open();
                   SqlCommand cmd = new SqlCommand();
                   cmd.Connection = conn;
                   string cmdText = "select IMAGENES from COLABORADOR where NUMERO = '" + (CodigoColaborador).Trim() + "'";
                   cmd.CommandText = cmdText;
                   cmd.CommandType = CommandType.Text;
                   SqlDataReader dr = cmd.ExecuteReader();
                      while (dr.Read())
                        {
    
                           DevolviendoImagen.Add(new ClaseBusquedaImage() { IMAGENES = (byte[])dr["IMAGENES"]});
                        }
                  }
                catch (Exception a)
                  {
                  }
                finally
                  {if (conn.State != ConnectionState.Closed)
                      {conn.Close();
                      }
                  }
                return DevolviendoImagen;
            }


    Todo compila bien Retorno el valor al UWP y puse un mensaje para cuando me retorne el valor si es 0 no tiene si es 1 retorna valor este es el codigo

    ToDoServiceWeb.Service1Client IMAGENES = new ToDoServiceWeb.Service1Client();

    ToDoListIMAGEN = IMAGENES.GetBuscarImagenesAsync(this.CODIGOCOLABORADOR.Text).Result;

    MessageDialog mensaje1 = new MessageDialog(("Cantidad " + ToDoListIMAGEN.Count.ToString())); mensaje1 .ShowAsync();

    Y lo que me retorna es 0 asi que no me envia nigun valor.... En realidad no se que estoy haciendo mal tipo de dato que esta en la base de datos es image no se si el tipo Byte[] tambien lo pueda tratar igual Gracias.

    • Editado José De Alva domingo, 22 de mayo de 2016 0:17 correccion en bloques de codigo
    sábado, 21 de mayo de 2016 16:42
  • javier bellido,

    Yo si creo que está obteniendo excepciones, sucede que "habilmente" usted las está "solapando", fíjese:

    catch (Exception a)
    	  {
    	  }

    ¿Qué objetivo tiene el bloque catch? En caso ocurra alguna excepción en el bloque try el flujo ingresará al bloque catch donde no se realiza nada, el programa proseguirá sin dar advertencia de que algo ha sucedido. Sospecho que debe obtener una excepción porque la clase ClaseBusquedaImagen tiene la propiedad APELLIDO_NOMBRE a la que no se asigna ningún valor, permitame modificar su código:

    public ObservableCollection<ClaseBusquedaImage> GetBuscarImagenes(string CodigoColaborador)
    {                  
    	ObservableCollection<ClaseBusquedaImage> DevolviendoImagen = new ObservableCollection<ClaseBusquedaImage>();
    	
    	string connectionString = "CADENA DE CONEXION ";
    	
    	try
    	{
    		using (SqlConnection cn = new SqlConnection(connectionStrin))
    		{		
    			cn.Open();
    			
    			string consultaSQL = "SELECT NOMBRE_APELLIDOS, IMAGENES FROM COLABORADOR WHERE (NUMERO = @NUMERO);
    			SqlCommand cmd = new SqlCommand(consultaSQL, cn);
    			
    			cmd.Parameters.AddWithValue("@NUMERO", CodigoColaborador);
    			
    			SqlDataReader dr = cmd.ExecuteReader();
    			while (dr.Read())
    			{
    				DevolviendoImagen.Add(new ClaseBusquedaImage() { NOMBRE_APELLIDO = dr.GetString(0), IMAGENES =  (byte[])dr["IMAGENES"]});
    			}
    		}
    	}
    	catch(Exception e)
    	{                
    		/*Mande un mensaje conteniendo e.Message*/		
    	}
    	
    	return DevolviendoImagen;
    }



    Bajo su entorno de desarrollo no estoy seguro la manera de mostrar un mensaje de error (algo como MessageBox.Show("Mensaje")) que funciona para WindowsForm, la idea es que en caso entre el flujo al bloque catch nos muestre el mensaje de error que se está produciendo (e.Message).

    Comentenos como le fue.


    sábado, 21 de mayo de 2016 17:38
  • Hola Willians Morales
    El codigo si funcionaba mil disculpas lo que sucede es que no lo habia publicado el WCF en el Servidor Windows Azure y tampoco habia actualizado en mi aplicacion UWP si me envia datos del WCF a la aplicacion puse dos MessageDialog

     ToDoServiceWeb.Service1Client IMAGENES = new ToDoServiceWeb.Service1Client();
                ToDoListIMAGEN = IMAGENES.GetBuscarImagenesAsync(this.CODIGOCOLABORADOR.Text).Result;
    
    //Este MessageDialog envia el valor 1 que quiere decir que si recibo un valor
    
                MessageDialog mensaje1  = new MessageDialog(("Estado " + ToDoListIMAGEN.Count.ToString()));
                mensaje1 .ShowAsync();
    
    
    
    
                int ia1;
                ia1 = ToDoListIMAGEN.Count;
                for (int abc = 0; abc < ia1; abc++)
                {   ToDoServiceWeb.ClaseBusquedaImage member = ToDoListIMAGEN[abc];
    
    // aca en este MessageDialog me envia el tipo de valor   System.Byte[]
    
                    MessageDialog mensaje1235 = new MessageDialog(("Imagen " + member.IMAGENES.ToString()));
                    mensaje1235.ShowAsync();
    
    //aca lo que hago es tomar el valor en Byte para colocarlo en el control IMAGE que le he puesto como //nombre FOTO pero no me aparece nada 
    
                    MemoryStream strmImg = new MemoryStream(member.IMAGENES);
                    BitmapImage myBitmapImage = new BitmapImage();
                    myBitmapImage.DecodePixelWidth = 200;
    
                    FOTO.Source = myBitmapImage;
    
                }
                IMAGENES.CloseAsync();
    


    No me envia nigun error no se que esta mal pienso que sera en la conversion de Byte a el FOTO.Source Gracias de antemano ...

    • Editado José De Alva lunes, 23 de mayo de 2016 16:57 correccion de bloques de codigo
    lunes, 23 de mayo de 2016 16:20
  • Bueno gracias a todos los que me colaboraron pude resolver mi situacion este es el codigo final que me sirvio para transformar la imagen de Byte a FOTO.source

    ToDoServiceWeb.Service1Client IMAGENES = new ToDoServiceWeb.Service1Client();
                ToDoListIMAGEN = IMAGENES.GetBuscarImagenesAsync(this.CODIGOCOLABORADOR.Text).Result;
                int ia1;
                ia1 = ToDoListIMAGEN.Count;
                for (int abc = 0; abc < ia1; abc++)
                {
                    ToDoServiceWeb.ClaseBusquedaImage member = ToDoListIMAGEN[abc];
                    InMemoryRandomAccessStream raStream = new InMemoryRandomAccessStream();
                    {
                        DataWriter writer = new DataWriter(raStream);
                        {
                            writer.WriteBytes(member.IMAGENES);
                            await writer.StoreAsync();
                            await writer.FlushAsync();
                            writer.DetachStream();
                        }
                        raStream.Seek(0);
                        BitmapImage bitMapImage = new BitmapImage();
                        bitMapImage.SetSource(raStream);
                        FOTO.Source = bitMapImage;
                    }
                }
                IMAGENES.CloseAsync();

    asi quedo mi pequeña aplicacion 

    http://subefotos.com/ver/?64d00e6c48e9130b08079d67e4c9f7c3o.png#codigos

    Muchas Gracias.....

    • Marcado como respuesta José De Alva lunes, 23 de mayo de 2016 20:16
    lunes, 23 de mayo de 2016 19:33