下面是兩段關鍵代碼:
/// <summary>
/// 將一張圖片轉換為字節 /// </summary> /// <param name="img">圖片</param> /// <param name="imgFormat">保存圖片的類型</param> /// <returns>byte[]</returns> public byte[] ImgToByte(Image img,System.Drawing.Imaging.ImageFormat imgFormat) { Bitmap bmp = new Bitmap(img); MemoryStream memStream = new MemoryStream(); bmp.Save(memStream, imgFormat); memStream.Seek(0, SeekOrigin.Begin); //及時定位流的開始位置 byte[] btImage = new byte[memStream.Length]; memStream.Read(btImage, 0, btImage.Length); memStream.Close(); return btImage; }
將PictureBox中的圖片以參數形式傳進,另一個參數是要轉換成的圖片類型。這個函數返回一個byte[]數組,調用這個函數,將返回的數組保存到數據庫中就可以了。數據庫的相應字段類型是 image 類型。需要特別注意的是這句
memStream.Seek(0, SeekOrigin.Begin); //及時定位流的開始位置
如果沒有這句話,在后邊讀取數據庫顯示圖片的時候就會報錯,“無效參數”。因為save以后流的指針停在了最后,這時馬上轉換成byte[],通過斷點調試會發現這個數組中的數據全是0,這樣肯定不會轉換成原來的圖片。保證了保存的正確,讀取的正確性才能最大限度的保證。
將從數據庫中讀取的數據轉換成圖片顯示到PictureBox,和保存的過程正好相反,下面是關鍵函數:
/// <summary> /// 將byte[]數組轉換成Image /// </summary> /// <param name="btImage">byte[]</param> /// <returns>Image img</returns> public Image ByteToImg(byte[] btImage) { MemoryStream memStream = new MemoryStream(); //Stream memStream = null; memStream.Write(btImage, 0, btImage.Length); memStream.Position = 0; memStream.Seek(0, SeekOrigin.Begin); //Bitmap bmp = new Bitmap(memStream, true); Image img; try { img = Image.FromStream(memStream,true); memStream.Close(); //img = new Bitmap(memStream); } catch (Exception ex) { img = null; } finally { //memStream.Close(); } return img; }
將從數據庫中取到的byte[]數據轉換成image后,用PictureBox.Image=img;就能顯示圖片了。
下邊這兩句的效果是一樣的,取其一就行
memStream.Position = 0; memStream.Seek(0, SeekOrigin.Begin);
還有需要注意的是用完Steam流以后要及時Close()釋放。這樣顯示圖片的時候就不會再報“無效參數”的錯誤了。