风中灵药
我的眼泪划伤了夜,那么的脆弱...

//fu_SelectImage(VS2005自带上传控件)
byte[] FileByteArray = fu_SelectImage.FileBytes;//图象文件临时储存Byte数组
Stream StreamObject = fu_SelectImage.FileContent;//建立数据流对像

Response.Write("文件长度为:"+ FileLength + "文件名为:" + fu_SelectImage.FileName + "文件类型为:" + fu_SelectImage.GetType().Name); //用来自己看看的。

//定义一个新的byte[]用来存放数据库中的图片byte[]
byte[] FileByteOldArray = new byte[1];

DataHandle dh = new DataHandle(); //这个是朋友写好的数据库操作类直接拿来用上了,主要是读取数据库指定字段内容。
dh.TargetTableName = "ImageStore"; //存图片的数据表
dh.DbConditionAdd("ImageID",5); //图片的ID(ID可以从网址参数处获得getimage.aspx?id=5)
SqlDataReader rd = dh.ExecuteReader();
if (rd.Read())
{
FileByteOldArray = (byte[])rd["ImageData"]; //从数据库取出图片的byte[],数据库此字段为Image类型
}
rd.Close();
dh.Close();

//将图像的字节数组放入内存流
MemoryStream oldms = new MemoryStream(FileByteOldArray); //存放数据库的图片字节数组内存流
MemoryStream newms = new MemoryStream(); //用来存放合并后的内存流

//合并位图,这个部分是关键,从这里也可以演化左右合并之类的。当然图片的缩小也差不多思路
Bitmap b1 = new Bitmap(oldms); //oldms老的存在数据库的内存流
Bitmap b2 = new Bitmap(StreamObject); //StreamObject新上传的图片流
Bitmap b = new Bitmap(b1.Width > b2.Width ? b1.Width : b2.Width, b1.Height + b2.Height+1); 
Graphics g = Graphics.FromImage(b);
g.DrawImage(b1,0,0);
g.DrawImage(b2, 0, b1.Height+1);//上下合并,把新图片放到老图片的下面,这个1主要是为了有1px的间隔,也可以去的。

//把合并后的位图保存到内存流中
b.Save(newms, ImageFormat.Jpeg);

//从合并后图片的内存流中取得存放数据库所需的相关参数
byte[] FileByteNewArray = newms.GetBuffer();
FileLength = FileByteNewArray.Length;

//释放资源
oldms.Dispose();
newms.Dispose();
b1.Dispose();
b2.Dispose();
b.Dispose();
g.Dispose();

//建立SQL Server链接
SqlConnection Con = new SqlConnection("Data Source=Localhost;Initial Catalog=MapPointManageDemo;User ID=sa;Pwd=sa;");
//String SqlCmd = "INSERT INTO ImageStore (ImageData, ImageContentType,ImageDescription, ImageSize) valueS (@Image, @ContentType,@ImageDescription, @ImageSize)";
String SqlCmd = "UPDATE ImageStore SET ImageData = @Image, ImageSize = ImageSize + @ImageSize WHERE ImageID = 5";
SqlCommand CmdObj = new SqlCommand(SqlCmd, Con);
CmdObj.Parameters.Add("@Image", SqlDbType.Binary, FileLength).Value = FileByteNewArray;//保存图片byte[]
//CmdObj.Parameters.Add("@ContentType", SqlDbType.VarChar, 50).Value = "image/jpeg"; //记录文件类型
//CmdObj.Parameters.Add("@ImageDescription", SqlDbType.VarChar, 200).Value = txtDescription.Text;//把其它单表数据记录上传
CmdObj.Parameters.Add("@ImageSize", SqlDbType.BigInt, 8).Value = FileLength;//记录文件长度,读取时使用
Con.Open();
CmdObj.ExecuteNonQuery();
Con.Close();

-----------
此示例是他人尝试的成果,不一定是最科学的做法,但可以作为参考

posted on 2012-02-23 21:04  风中灵药  阅读(338)  评论(0编辑  收藏  举报