如何在水晶报表中动态显示任意格式的图片?

       前段时间,Accounting 项目内需要在水晶报表中动态显示任意格式的图片。但是,水晶报表只支持OleDb的静态加载图片和动态在 IFieldObject中显示图片,显然,静态加载是不行的了,而后者仅支持JPEG和BMP格式的图片。因此,我们需要把任意格式的图片预先转换成受支持的JEPG或BMP格式,再填充到DataSet中,然后动态地推入到水晶报表中。

      下面的示例中将讲述如何将一个给定路径或从其它途径得到的一个图片流转换成JPEG格式并返回成一个字节数组,以提供给后续应用:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace Common
{
    
/// <summary>
    
/// 与图像相关的工具类。
    
/// </summary>

    public class ImageUtil
    
{
        
public ImageUtil()
        
{
        }


        
/// <summary>
        
/// 从指定路径中读取一个图像文件并保存到字节数组中。
        
/// 此方法供水晶报表显示图片使用,所返回字节数组是 BMP 或 JEPG 格式图像数据的数组。
        
/// </summary>
        
/// <param name="path">指定的文件路径</param>
        
/// <returns>从图像中读取出的数据。</returns>

        public static byte[] ReadImage(string path)
        
{
            FileStream stream 
= null;
            
try
            
{
                stream 
= File.OpenRead(path);
                
return ReadImage(stream);
            }

            
finally
            
{
                
if(stream != null)
                
{
                    stream.Close();
                }

            }

        }


        
/// <summary>
        
/// 从给定的流中读取数据到一个字节数组中,并返回此数组。
        
/// 如果给定的流不是一个图像格式的流,将报异常。
        
/// 返回的字节数组中,将非BMP和JEPG格式的图像数据流转换为JEPG格式输出,以支持大多数应用。
        
/// 适用于直接从数据库中读取的二进制图像流的处理。
        
/// </summary>
        
/// <param name="stream">给定的图像数据流。</param>
        
/// <returns>从流中读取的数据。</returns>

        public static byte[] ReadImage(Stream stream)
        
{
            Image image 
= Image.FromStream(stream);
            
byte[] myImage = null;

            
if(image.RawFormat.Guid != ImageFormat.Jpeg.Guid && image.RawFormat.Guid != ImageFormat.Bmp.Guid)
            
{
                MemoryStream memStream 
= new MemoryStream();
                image.Save(memStream, ImageFormat.Jpeg);
                myImage 
= memStream.GetBuffer();
                memStream.Close();
            }

            
else
            
{
                stream.Position 
= 0;
                myImage 
= new byte[stream.Length];
                stream.Read(myImage, 
0, (int)stream.Length);
            }

            
return myImage;
        }

    }

}

下面是应用上面代码的一个示例(非完整):

 1private void Form7_Load(object sender, System.EventArgs e)
 2        {
 3            string[] etc = new string[]{"jpg""gif""bmp""tif""png"};
 4            string path = @"C:\Documents and Settings\sh12\My Documents\My Pictures\NeweggLogo.";
 5            try
 6            {
 7                byte[] myImage = null;
 8
 9                Dataset2 ds = new Dataset2();
10                DataRow drNew = null;
11                for(int i=0; i<etc.Length; i++)
12                {
13                    myImage = Newegg.Common.ImageUtil.ReadImage(path + etc);
14
15                    drNew = ds.MyTable.NewRow();
16                    drNew["ImageType"= etc;
17                    drNew["ImageData"= myImage;
18                    ds.MyTable.Rows.Add(drNew);
19                }

20
21                myImage = Newegg.Common.ImageUtil.ReadImage(@"C:\Documents and Settings\sh12\My Documents\My Pictures\untitled.JPG");
22                drNew = ds.MyTable.NewRow();
23                drNew["ImageType"= "untitled.JPG";
24                drNew["ImageData"= myImage;
25                ds.MyTable.Rows.Add(drNew);
26
27                ds.AcceptChanges();
28
29                CrystalReport1 rpt = new CrystalReport1();
30                rpt.SetDataSource(ds);
31                this.crystalReportViewer1.ReportSource = rpt;
32            }

33            catch(Exception ex)
34            {
35                MessageBox.Show(ex.Message);
36            }

37        }

其实这个实现非常简单,思路也容量想到。只是,还是希望能够给大家提供一些帮助或启迪了。

谢谢大家的阅读!

请指正! 

posted on 2005-12-17 12:43  流浪狗  阅读(7516)  评论(4编辑  收藏  举报