9

我正在使用报告文件和 ReportViewer 控件来显示在运行时从对象动态加载数据的报告。

我需要显示在对象中存储为字节数组的图像。

PictureBox 的值当前设置为:

=First(Fields!ImageData.Value, "dtstItemImage")

我使用以下方法设置数据源:

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 对象。

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

4

2 回答 2

5

我设法通过将报告的图像框Source属性设置为Database(之前设置为External)来解决此问题。

可以在(MSDN) HowTo: Add an Image (Reporting Services)中找到有关不同可用 Source 值的更多信息。

于 2012-09-10T06:27:38.413 回答
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;
}

注意:您也可以使用 来执行此操作IValueConverter,请参阅此博客文章以获取源代码


然后修改你的数据绑定

ImageBindingSource.DataSource = LoadImage(item.Image.ImageData);

...

确保MemoryStream在完成后正确处理图像(和),否则会泄漏内存。

此外,根据字节数组的格式,您可能需要做一些工作。有关一些有用信息,请参阅我的问题/答案之一

于 2012-09-07T13:36:11.673 回答