思路:在数据库新建image格式字段【photo1】,原有字段varchar(200)【photo】存放的是图片地址(相对路径,格式"../image/..",非网络图片)
先读取【photo]字段指定的图片,存储图片流到数组,存入到【photo1】中,即可把【photo1】直接拖到水晶报表中。
环境:vs2003 (c#)+sqlserver+crystal reports10
------------------------------------------------------------华丽无比分割线-------------------------------------------------------
转换函数:
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)
{
System.Drawing.Image image = System.Drawing.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;
}
------------------------------------------------------------华丽无比分割线-------------------------------------------------------
报表datasource绑定:
string strLogoUrl;
byte[] bt;
for(int i=0;i<ds.Tables[0].Rows.Count;i++)
{
if(ds.Tables[0].Rows[i]["Photo"].ToString()!=null)
{
strLogoUrl =Request.PhysicalApplicationPath+ ds.Tables[0].Rows[i]["Photo"].ToString().Substring(2,ds.Tables[0].Rows[i]["Photo"].ToString().Length-2);//图片绝对路径
bt=ReadImage(strLogoUrl);
ds.Tables[0].Rows[i]["Photo1"] = bt;
ds.AcceptChanges();
}
}
rpt.SetDataSource(ds.Tables[0]);
最近日志编辑老出问题。
重写!!
崩