如何将PNG图像(作为内存流)呈现到.NET ReportViewer报告图面上
时间:2020-03-05 18:45:37 来源:igfitidea点击:
我有一个动态创建的图像,该图像将保存到流中,以便可以在ReportViewer曲面上显示它。
设置:
- Windows客户端应用程序(不是WebForms)
- 报表数据源是一个对象数据源,具有动态生成的流作为属性(CustomImage)
- Report.EnableExternalImages = true
- Image.Source =数据库
- Image.MIMEType =图片/ png
- Image.Value = =字段!CustomImage.Value
这是行不通的,但是没有报告任何错误,只是在报告表面显示了一个空的图像图标。所有其他字段显示正确。
有人有这种情况的工作代码示例吗?
解决方案
回答
我正在做类似的事情,以便在报告上更改徽标,但是我利用报告参数来传递值。如果图像是数据的一部分,我看不出为什么这种通用方法不起作用的任何原因。
本质上,图像通过两个字段传递。第一个字段是MIME类型值,第二个字段是包含图像内容的Base64编码的字符串。
步骤1:将图片转换为Base64编码。 (我们的代码总是将ImageFormat.Png
传递给此方法,以使MIME类型变得容易)
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); }
步骤2:将图片和MIME类型传递给报告。
reportParams[0] = new ReportParameter("ReportLogo", base64Logo); reportParams[1] = new ReportParameter("ReportLogoMimeType", "image/png"); _reportViewer.LocalReport.SetParameters(reportParams);
步骤3:在报告中,在图片上设置以下属性(不带引号):
- MIMEType:"
= Parameters!ReportLogoMimeType.Value
" - 值:"
= System.Convert.FromBase64String(Parameters!ReportLogo.Value)
" - 更新:正如Gerardo在下面所述,图像源必须设置为"数据库"
年轻球员的陷阱:
通常,即使我们传入的图像看起来像是"正确的尺寸",图像也会看起来很恐怖,并且像已经缩放一样。这是因为报表是为打印(300 dpi)而不是屏幕(通常为72或者92 dpi)呈现的。解决方法是发送大约3倍大的图像,在报告中设置正确的尺寸,然后将图像上的"Sizing
"属性更改为"FitProportional
"。