分享
 
 
 

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

王朝c#·作者佚名  2008-12-13
窄屏简体版  字體: |||超大  

項目上要求把圖片存入數據庫,有時候圖片是分開的但是要在上傳時合並(上下合並,新傳的圖片放後面,特殊需要呵呵)。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

 
 
 
免責聲明:本文為網絡用戶發布,其觀點僅代表作者個人觀點,與本站無關,本站僅提供信息存儲服務。文中陳述內容未經本站證實,其真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
  項目上要求把圖片存入數據庫,有時候圖片是分開的但是要在上傳時合並(上下合並,新傳的圖片放後面,特殊需要呵呵)。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();附帶點其它的圖片操作模式 來源於:[url=http://topic.csdn.net/t/20050225/15/3806327.htmlview]http://topic.csdn.net/t/20050225/15/3806327.htmlview[/url] 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; } [url=http://blog.breakn.net/article.asp?id=325]http://blog.breakn.net/article.asp?id=325[/url]
美眾議院議長啟動對拜登的彈劾調查
 百态   2023-09-13
上海、濟南、武漢等多地出現不明墜落物
 探索   2023-09-06
印度或要將國名改為「巴拉特」
 百态   2023-09-06
男子為女友送行,買票不登機被捕
 百态   2023-08-20
手機地震預警功能怎麽開?
 干货   2023-08-06
女子4年賣2套房花700多萬做美容:不但沒變美臉,面部還出現變形
 百态   2023-08-04
住戶一樓被水淹 還衝來8頭豬
 百态   2023-07-31
女子體內爬出大量瓜子狀活蟲
 百态   2023-07-25
地球連續35年收到神秘規律性信號,網友:不要回答!
 探索   2023-07-21
全球鎵價格本周大漲27%
 探索   2023-07-09
錢都流向了那些不缺錢的人,苦都留給了能吃苦的人
 探索   2023-07-02
倩女手遊刀客魅者強控制(強混亂強眩暈強睡眠)和對應控制抗性的關系
 百态   2020-08-20
美國5月9日最新疫情:美國確診人數突破131萬
 百态   2020-05-09
荷蘭政府宣布將集體辭職
 干货   2020-04-30
倩女幽魂手遊師徒任務情義春秋猜成語答案逍遙觀:鵬程萬裏
 干货   2019-11-12
倩女幽魂手遊師徒任務情義春秋猜成語答案神機營:射石飲羽
 干货   2019-11-12
倩女幽魂手遊師徒任務情義春秋猜成語答案昆侖山:拔刀相助
 干货   2019-11-12
倩女幽魂手遊師徒任務情義春秋猜成語答案天工閣:鬼斧神工
 干货   2019-11-12
倩女幽魂手遊師徒任務情義春秋猜成語答案絲路古道:單槍匹馬
 干货   2019-11-12
倩女幽魂手遊師徒任務情義春秋猜成語答案鎮郊荒野:與虎謀皮
 干货   2019-11-12
倩女幽魂手遊師徒任務情義春秋猜成語答案鎮郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手遊師徒任務情義春秋猜成語答案鎮郊荒野:指鹿為馬
 干货   2019-11-12
倩女幽魂手遊師徒任務情義春秋猜成語答案金陵:小鳥依人
 干货   2019-11-12
倩女幽魂手遊師徒任務情義春秋猜成語答案金陵:千金買鄰
 干货   2019-11-12
倩女幽魂手遊師徒任務情義春秋猜成語答案金陵:倒履相迎
 干货   2019-11-12
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有