将 Img 重新加载到内存流会导致 [ GDI+ 中发生一般错误]

Reloading Img to memorystream causes a [ A generic error occurred in GDI+ ]

我尝试更新数据库中的记录图像时遇到问题。

我使用的工作流程如下:

  1. 用户使用 FilaDialog 将图像加载到图片框。

         DialogResult path = openFileDialog1.ShowDialog();
         if (path == DialogResult.OK)
         {
             pictureBox.Image = new Bitmap(openFileDialog1.FileName);
             pictureBox.Refresh();
         }
    
  2. 在用户完成剩余字段的插入并尝试保存图像后,图像将从 PictureBox 加载并保存到数据库中。

     Image img = PictureBox.Image;
     byte[] photo_aray = null;
             using (MemoryStream ms = new MemoryStream())
              {
                     img.Save(ms, ImageFormat.Jpeg);
                     photo_aray = new byte[ms.Length];
                     ms.Position = 0;
                     ms.Read(photo_aray, 0, photo_aray.Length);
              }
    

到目前为止一切顺利,但是当我尝试更新图像时出现问题,如下所示:

  1. 用户从列表中选择记录,事件加载记录信息,图像加载到 PictureBox。

  2. 在用户完成更新剩余字段并尝试保存图像后,使用上面编写的相同逻辑从 PictureBox 加载图像并保存到数据库,并对 SQL查询。

     Image img = PictureBox.Image;
     byte[] photo_aray = null;
             using (MemoryStream ms = new MemoryStream())
              {
                     img.Save(ms, ImageFormat.Jpeg); // BREAKING POINT
                     photo_aray = new byte[ms.Length];
                     ms.Position = 0;
                     ms.Read(photo_aray, 0, photo_aray.Length);
              }
    

每次用户尝试更新时,都会显示以下错误消息:

A generic error occurred in GDI+.:: at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) at System.Drawing.Image.Save(Stream stream, ImageFormat format)

请注意,如果用户更改图像或仅使用文件对话框选择相同图像,则不会发生错误。

感谢任何帮助。

****** 编辑 #1 *********

澄清一下,

  1. 记录首先从数据库加载到绑定到列表的 RecordsList 对象中。
  2. 当用户选择某条记录时,图像从所选记录加载到 PictureBox。
  3. 如果没有对图片进行任何更改,则图片从 picturebox 加载到上述逻辑。

感谢@Jimi 先生,我已经设法解决了这个问题。

正如他亲切指出的那样,我需要在保存对象后处理内存流。

所以我的代码是这样编辑的:

Image img = PictureBox.Image;
byte[] photo_aray = null;
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Jpeg); 
photo_aray = new byte[ms.Length];
ms.Position = 0;
ms.Read(photo_aray, 0, photo_aray.Length);
//
//
//SQL UPDATE HERE
//
//
ms.Close();
ms.Dispose();

谢谢!