2008-08-31 23 views
12

Tengo una imagen creada dinámicamente que estoy guardando en una secuencia para que pueda mostrarla en una superficie ReportViewer.¿Cómo puedo representar una imagen PNG (como una secuencia de memoria) en una superficie de informe .NET ReportViewer

Configuración:

  • aplicación cliente de Windows (no WebForms)
  • Informe fuente de datos es un origen de datos de objeto, con una corriente generada dinámicamente como una propiedad (CustomImage)
  • Report.EnableExternalImages = true
  • Image.Source = Base de datos
  • Image.MIMEType = image/png
  • Image.Value = = Campos! CustomI mage.Value

Esto no funciona, pero no informa ningún error, solo muestra un icono de imagen vacío en la superficie del informe. Todos los demás campos se muestran correctamente.

¿Alguien tiene una muestra del código de trabajo de este escenario?

Respuesta

26

Estoy haciendo algo similar para tener un logotipo cambiante en los informes, pero utilizo parámetros de informe para pasar el valor. No veo ninguna razón por la cual este método general no funcionaría si las imágenes fueran parte de los datos.

Esencialmente las imágenes se pasan sobre dos campos. El primer campo es el valor de tipo MIME y el segundo campo es una cadena codificada en Base64 que contiene el contenido de la imagen.

Paso 1: Convierta su imagen en codificación Base64. (Nuestro código pasa siempre ImageFormat.Png a este método para hacer el tipo MIME fácil)

private static string ConvertImageToBase64(Image image, ImageFormat format) 
{ 
    byte[] imageArray; 

    using (System.IO.MemoryStream imageStream = new System.IO.MemoryStream()) 
    { 
     image.Save(imageStream, format); 
     imageArray = new byte[imageStream.Length]; 
     imageStream.Seek(0, System.IO.SeekOrigin.Begin); 
     imageStream.Read(imageArray, 0, imageStream.Length); 
    } 

    return Convert.ToBase64String(imageArray); 
} 

Paso 2: Pase el tipo de imagen y MIME para el informe.

reportParams[0] = new ReportParameter("ReportLogo", base64Logo); 
reportParams[1] = new ReportParameter("ReportLogoMimeType", "image/png"); 

_reportViewer.LocalReport.SetParameters(reportParams); 

Paso 3: En el informe establezca las propiedades siguientes en la imagen (sin las comillas):

  • MIMEType: " =Parameters!ReportLogoMimeType.Value "
  • Valor: " =System.Convert.FromBase64String(Parameters!ReportLogo.Value) "
  • ACTUALIZACIÓN: Como Ger Ardo de dice a continuación, la imagen de la fuente se debe establecer en 'Base de datos'

Trampa para los jugadores jóvenes: A menudo, las imágenes se ven horribles y como si hubieran sido reducido a pesar de que estás pasando de una imagen que parece ser el "tamaño correcto". Esto se debe a que los informes se procesan para impresión (300 ppp) y no para la pantalla (generalmente 72 o 92 ppp). La solución es enviar una imagen aproximadamente 3 veces más grande, establecer su tamaño correcto en el informe y cambiar la propiedad "Sizing" en la imagen a "FitProportional".

+0

¡Muchas gracias, me han ayudado mucho! – Martijn

+7

Solo quería aclarar que la fuente de la imagen debe estar configurada en ** Base de datos **. No podría hacer que esta solución funcione hasta que establezca la propiedad de Fuente en el valor correcto. Un pequeño detalle que puede perderse si no le presta atención. –

+0

@Adrian: Tengo el mismo problema, he intentado como describiste aquí, pero eso no funcionó para mí, por favor revisa mi pregunta [aquí] (http://stackoverflow.com/questions/42020490/base64-image-doesnt- display-on-render-pdf-from-rdlc-report) –

Cuestiones relacionadas