C# 保存PictureBox中的圖片到數據庫,並從數據庫讀取圖片顯示到PictrueBox,解決報錯 “無效參數”


下面是兩段關鍵代碼:

        
/// <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()釋放。這樣顯示圖片的時候就不會再報“無效參數”的錯誤了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM