C# 2.0中的上傳多個圖片合並及存入數據庫的示例

  項目上要求把圖片存入數據庫,有時候圖片是分開的但是要在上傳時合並(上下合並,新傳的圖片放後面,特殊需要呵呵)。Google了半天網上有圖片存入數據庫的示例,便是合並的就基本沒用,有也是少量其它操作方式的代碼片段。結合網上思路,研究出圖片合並的比較完整的代碼如下:
  代碼類型:C# 2.0
  說明:此文本站原創,轉載請注明出處
  上傳文件使用的是VS2005自帶的上傳控件
  省略相關上傳的及其它不怎麽太有關系的代碼,上傳代碼看MSDN幫助,比較完整
  合並流程:上傳一張,存入數據庫,然後再上傳一張和指定存入數據庫的圖片合並後更新數據庫字段view plaincopy to clipboardprint?
  //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();
  //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();附帶點其它的圖片操作模式
  來源于:http://topic.csdn.net/t/20050225/15/3806327.htmlview plaincopy to clipboardprint?
  //處理圖片大小到指定尺寸,返回值爲一個Image對象,使用Image對象的Save方法就可以保存該圖片
  //詳細用法查MSDN
  private System.Drawing.Image PhotoSizeChange(string strPhoto)
  {
  //strPhoto是原來的圖片文件所在的物理路徑
  //處理圖片功能
  System.Drawing.Image image = new Bitmap(strPhoto);//得到原圖
  //創建指定大小的圖
  System.Drawing.Image newImage = image.GetThumbnailImage(指定寬(像素值 int), 指定高(像素值 int), null, new IntPtr());
  Graphics g=Graphics.FromImage(newImage);
  //將原圖畫到指定的圖上
  g.DrawImage(newImage,X,Y, newImage.Width, newImage.Height);
  g.Dispose();
  return newImage;
  }
http://blog.breakn.net/article.asp?id=325