Buscar

viernes, 17 de abril de 2009

Insertar imágenes dinámicamente en Cristal Report con C# 2005

Insertar imágenes dinámicamente en Cristal Report
Muchas veces tenemos que insertar imágenes ennuestros reportes dependiendo el registro que estemos mostrando, una forma queme a funcionado muy bien es la siguiente.
Cuando diseñemos el reporte debemos insertar un campo de tipo System.Byte[] en el DataTable utilizadopara el diseño de nuestro reporte, en este campo meteremos la imagen entiempo de ejecución.


Este campo se inserta en el reporte y será dondemostraremos la imagen.



Para mostrar el reporte utilizamos lo siguiente, para llenarel campo creado.

public void CargarReporte()
{
DataTable Dt = new
DataTable();//Creo un DataTable que sera la fuente de datos de mi reporte.
Dt=clsOrdenTerceros.Get_InfoParaOrdenImpresa(NumOrden);//Lleno el DataTable

rptOrdenSalidaTercero rpt = new rptOrdenSalidaTercero();// instancio el reporte

Dt.Columns.Add("Ruta11",System.Type.GetType("System.Byte[]"));//Agrego la columna con el tipo de dato "System.Byte[]",donde guardare mi imagen.

Dt.Rows[0]["Ruta11"] = CargarImagen("C:\foto.jpg"));//Cargo La imagen

rpt.SetDataSource(Dt);//Asigno la fuente de datos a mi reporte.
}

Y esta es la función que carga la imagen.


public static Byte[]CargarImagen(string rutaArchivo)
{


if (rutaArchivo != "")
{

try
{

FileStream Archivo = new FileStream(rutaArchivo, FileMode.Open);//Creo el archivo
BinaryReader binRead = new BinaryReader(Archivo);//Cargo el Archivo en modo binario

Byte[] imagenEnBytes = new Byte[(Int64)Archivo.Length]; //Creo un Array de Bytes donde guardare la imagen

binRead.Read(imagenEnBytes,0, (int)Archivo.Length);//Cargo la imagen en el array de Bytes
binRead.Close();

Archivo.Close();

return imagenEnBytes;//Devuelvo la imagen convertida en un array de bytes

}


catch
{
return new Byte[0];
}

}

return new byte[0];

}



Espacio de nombre Usados


using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;

13 comentarios:

  1. En este enlace hay otra forma de leer las imágenes y cambiarles la resolución, ya que muchas veces el Crystal saca errores cuando la imagen tiene una resolución mayor a 100 ppp

    http://codigodepuracepa.blogspot.com/2010/03/cambiar-reslucion-una-imagen-en-c.html

    ResponderEliminar
  2. hola puede poner el proyecto de ejemplo es que lo estoy haciendo y no me da...

    ResponderEliminar
  3. Que no le da .... ? que error le sale?

    ResponderEliminar
  4. pues la verdad en la cargada de la imagen le doy la ruta

    FileStream Archivo = new FileStream(rutaArchivo, FileMode.Open);//Creo el archivo

    y de esta linea no pasa se sale al catch como si no puedra abrir la imagen

    ResponderEliminar
  5. Puede ser por permisos, intenta abrirla en modo lectura
    FileStream Archivo = new FileStream(rutaArchivo, FileMode.Open,FileAccess.Read)
    ó remplaza el metodo "CargarImagen", por "imageToByteArray" que esta en este link:
    http://codigodepuracepa.blogspot.com/2010/03/cambiar-reslucion-una-imagen-en-c.html

    ResponderEliminar
  6. nada no sale depronto es que tenga algo malo en las otras lineas de codigo
    no sera posible que subas la solucion. se lo agradeceria mucho... o mandamelo al correo pablo4426@gmail.com

    ResponderEliminar
  7. Hola ... como estan ... espero q muy bien ... la verdad muchas gracias me sirvio exactamente para lo q necesitaba... no se q hubiera heco sin uds...

    ResponderEliminar
  8. hola que tal me podrian explicar esta parte del codigo por que no se que son cada cosa por favor:
    Dt=clsOrdenTerceros.Get_InfoParaOrdenImpresa(NumOrden);

    el Dt se que es el data table pero lo demas no se que sea

    ResponderEliminar
  9. clsOrdenTerceros.Get_InfoParaOrdenImpresa(NumOrden), es una clase, donde yo le envio un parámetro y el me devuelve un dataTable con la información, que yo nececito para mi reporte, en su caso puede ser una consulta cualquiera, el caso es llenar el datatable, espero haberme explicado bien.

    ResponderEliminar
  10. Me solicitaron crear un reporte que en la estructura tiene campos con texto e imágenes, lo que lo hace particular es que las imágenes pueden variar en cantidad y no quisiera dejar espacios en blanco en el reporte. Existe alguna forma de asignar dinámicamente las fotografías al reporte sin que deje espacios, es decir, que justifique cuando sea solo una imágen que aparezca en el centro, y así sucesivamente que las vaya asignando a una cierta región. Entiendo que a lo mejor estoy frente a dos problemas, manejar varias imágenes en un reporte en forma dinámica y la distribución de las mismas en el cuerpo definido del reporte.

    Saludos
    Antonio

    ResponderEliminar
  11. Disculpa, como puedo poner un logo en el encabezado de un reporte, C#, visula estudio 2008

    ResponderEliminar
  12. buen aporte, solo un detalle.. como se utiliza C# la ruta correcta es asi: "C:\\foto.jpg" y no "C:\foto.jpg"

    ResponderEliminar
  13. Si, tiene toda la razon, tambien se puede usar @"C:\\foto.jpg", el @ significa texto explicito.

    ResponderEliminar