我正在使用Report文件和ReportViewer控件来显示在运行时从对象动态加载数据的报告。
我需要显示一个在对象中存储为字节数组的图像。
PictureBox的值当前设置为:
=First(Fields!ImageData.Value, "dtstItemImage")
我使用以下方式设置DataSource:
ImageBindingSource.DataSource = this.item.Image.ImageData;
代码编译并运行但图像未显示在报告中。
这是因为PictureBox需要绑定到Image对象(而不是字节数组)吗?或者我可能需要设置PictureBox的一些属性吗?
更新1
我为PictureBox添加了一个边框,只是为了确保它是可见的,它确实显示在报告中。它只是不包含图像。
更新2
我在我的代码中修正了一个错误。我改变了:
ImageBindingSource.DataSource = this.item.Image.ImageData;
为:
ImageBindingSource.DataSource = this.item.Image;
因为PictureBox绑定到ImageData字段但是DataSource是Image对象。
现在我得到一个小十字图标,而不是什么(至少对我来说)表示有一些进展,但我不知道字节[] - 位图转换代码需要在哪里。
答案 0 :(得分:1)
您需要从字节数组创建一个图像对象,并将其用作源。
为此,您可以使用如下所示的辅助函数
public static Image LoadImage(byte[] imageBytes)
{
Image image = null;
using (var ms = new MemoryStream(imageBytes))
image = Image.FromStream(ms);
return image;
}
修改强>
对于WPF,您需要使用BitmapSource
(MSDN)而不是Image
(MSDN)
public static BitmapSource LoadImage(Byte[] imageBytes)
{
var image = new BitmapImage();
using (var ms = new MemoryStream(binaryData))
{
image.BeginInit();
image.StreamSource = ms;
image.CacheOption = BitmapCacheOption.OnLoad;
image.EndInit();
}
if (image.CanFreeze)
image.Freeze();
return image;
}
NB:您也可以使用IValueConverter
执行此操作,请参阅此blog post for the source code。
然后修改数据绑定
ImageBindingSource.DataSource = LoadImage(item.Image.ImageData);
...
确保图像(和MemoryStream
)在完成后正确放置,否则会泄漏内存。
此外,根据字节数组的格式,您可能需要做一些工作。查看我的question/answers for some helpful information之一。