2008-08-31 12 views
12

J'ai une image créée dynamiquement que je sauvegarde dans un flux afin de pouvoir l'afficher sur une surface ReportViewer.Comment rendre une image PNG (en tant que flux de mémoire) sur une surface de rapport .NET ReportViewer

Configuration:

  • application Windows Client (non WebForms)
  • Rapport DataSource est une source de données objet, avec un flux généré dynamiquement une propriété (CustomImage)
  • Report.EnableExternalImages = true
  • Image.Source = Base de données
  • Image.MIMEType = image/png
  • Image.Value = = Champs! CustomI mage.Value

Ceci ne fonctionne pas, mais ne signale aucune erreur, en affichant simplement une icône d'image vide sur la surface du rapport. Tous les autres champs s'affichent correctement.

Quelqu'un at-il un exemple de code de travail de ce scénario?

Répondre

26

Je fais quelque chose de similaire afin d'avoir un changement de logo sur les rapports mais j'utilise des paramètres de rapport pour passer la valeur. Je ne vois pas pourquoi cette méthode générale ne fonctionnerait pas si les images faisaient partie des données. Essentiellement, les images sont transmises sur deux champs. Le premier champ est la valeur Type MIME et le deuxième champ est une chaîne codée Base64 contenant le contenu de l'image.

Étape 1: Convertissez votre image en codage Base64. (Notre code passe toujours ImageFormat.Png à cette méthode pour rendre le type MIME facile)

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

Étape 2: Faites passer l'image et le type MIME au rapport.

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

_reportViewer.LocalReport.SetParameters(reportParams); 

Étape 3: Dans le rapport établi les propriétés suivantes sur l'image (sans les guillemets):

  • MIMEType: " =Parameters!ReportLogoMimeType.Value "
  • Valeur: " =System.Convert.FromBase64String(Parameters!ReportLogo.Value) "
  • MISE À JOUR: En tant que Ger dit de Ardo ci-dessous, l'image source doit être réglée sur « Database »

Piège pour les jeunes joueurs: Souvent, les images seront horribles et comme ils ont été mis à l'échelle, même si vous passez dans une image ce qui semble être la "bonne taille". C'est parce que les rapports sont rendus pour l'impression (300 dpi) et non l'écran (habituellement 72 ou 92 dpi). Le correctif consiste à envoyer une image à peu près trois fois trop grande, à définir sa taille correcte dans le rapport et à remplacer la propriété "Sizing" par "FitProportional".

+0

Thnx beaucoup, m'a aidé beaucoup! – Martijn

+7

Je voulais juste préciser que la Source de l'image doit être définie sur ** Base de données **. Je ne pouvais pas faire fonctionner cette solution jusqu'à ce que j'ai défini la propriété Source à la valeur correcte. Un petit détail qui peut être manqué si vous ne faites pas attention. –

+0

@Adrian: J'ai le même problème, mais je n'ai pas travaillé pour moi s'il vous plaît vérifier ma question [ici] (http://stackoverflow.com/questions/42020490/base64-image-doesnt- display-on-render-pdf-from-rdlc-report) –

Questions connexes