zoukankan      html  css  js  c++  java
  • 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()释放。这样显示图片的时候就不会再报“无效参数”的错误了。

  • 相关阅读:
    Windows Server 2003 SP2(32位) 中文版 下载地址 光盘整合方法
    用Recycle()方法对Java对象的重要性
    Lotus中千奇百怪的 $$
    Developing a simple application using steps "User Decision" and "Mail"(1) 沧海
    沟通中的情绪管理(演讲稿) 沧海
    人只有在压力之下,才可能成功,没做一件事,都必须成功,不许言败 沧海
    什么是IDOC,以及IDOC的步骤 沧海
    VS2008 Professional Edition CHS中的deffactory.dat读取错误 沧海
    Including custom text in the step "User Decision" 沧海
    SAP Upgrade Strategy 沧海
  • 原文地址:https://www.cnblogs.com/harmonyboy/p/3369888.html
Copyright © 2011-2022 走看看