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

  • 相关阅读:
    关闭Antimalware
    C#转义符
    属性与字段的思考
    TimescaleDB安装
    返回更弱的类型
    Polly HttpClient重试机制
    一步改造成async异步方法
    监听节点属性变化
    浏览器事件循环
    笔记产品会不会被淘汰
  • 原文地址:https://www.cnblogs.com/harmonyboy/p/3369888.html
Copyright © 2020-2023  润新知