如何在Microsoft报表中显示来自字节数组的图像

时间:2012-09-07 13:28:13

标签: c# image report bytearray picturebox

我正在使用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对象。

现在我得到一个小十字图标,而不是什么(至少对我来说)表示有一些进展,但我不知道字节[] - 位图转换代码需要在哪里。

1 个答案:

答案 0 :(得分:1)

您需要从字节数组创建一个图像对象,并将其用作源。

为此,您可以使用如下所示的辅助函数

public static Image LoadImage(byte[] imageBytes)
{
     Image image = null;
     using (var ms = new MemoryStream(imageBytes))
         image = Image.FromStream(ms);

     return image;
}

修改

对于WPF,您需要使用BitmapSourceMSDN)而不是ImageMSDN

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之一。