将 Img 重新加载到内存流会导致 [ GDI+ 中发生一般错误]
Reloading Img to memorystream causes a [ A generic error occurred in GDI+ ]
我尝试更新数据库中的记录图像时遇到问题。
我使用的工作流程如下:
用户使用 FilaDialog 将图像加载到图片框。
DialogResult path = openFileDialog1.ShowDialog();
if (path == DialogResult.OK)
{
pictureBox.Image = new Bitmap(openFileDialog1.FileName);
pictureBox.Refresh();
}
在用户完成剩余字段的插入并尝试保存图像后,图像将从 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);
}
到目前为止一切顺利,但是当我尝试更新图像时出现问题,如下所示:
用户从列表中选择记录,事件加载记录信息,图像加载到 PictureBox。
在用户完成更新剩余字段并尝试保存图像后,使用上面编写的相同逻辑从 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 *********
澄清一下,
- 记录首先从数据库加载到绑定到列表的 RecordsList 对象中。
- 当用户选择某条记录时,图像从所选记录加载到 PictureBox。
- 如果没有对图片进行任何更改,则图片从 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();
谢谢!
我尝试更新数据库中的记录图像时遇到问题。
我使用的工作流程如下:
用户使用 FilaDialog 将图像加载到图片框。
DialogResult path = openFileDialog1.ShowDialog(); if (path == DialogResult.OK) { pictureBox.Image = new Bitmap(openFileDialog1.FileName); pictureBox.Refresh(); }
在用户完成剩余字段的插入并尝试保存图像后,图像将从 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); }
到目前为止一切顺利,但是当我尝试更新图像时出现问题,如下所示:
用户从列表中选择记录,事件加载记录信息,图像加载到 PictureBox。
在用户完成更新剩余字段并尝试保存图像后,使用上面编写的相同逻辑从 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 *********
澄清一下,
- 记录首先从数据库加载到绑定到列表的 RecordsList 对象中。
- 当用户选择某条记录时,图像从所选记录加载到 PictureBox。
- 如果没有对图片进行任何更改,则图片从 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();
谢谢!