保存从数据库中检索到的图像时出错
Error when saving image that was retrieved from DB
情况如下:
- 我可以用 PixPictureBox 中的图片保存 () 员工条目
到数据库。
- 如果我编辑员工条目并将图片从
有了新的 PixPictureBox,Update() 正常。
- 这就是错误所在,每当我编辑员工条目但不更改 PixPictureBox 的图像时,
Update()
方法会抛出以下异常:
$exception {"A generic error occurred in GDI+."} System.Runtime.InteropServices.ExternalException
此方法引发此错误:
private byte[] ImageToByteArray(Image imageIn)
{
using (var ms = new MemoryStream())
{
imageIn.Save(ms, imageIn.RawFormat);
return ms.ToArray();
}
}
这是我的 GetParams()
方法,其中使用了 ImageToByteArray
:
private void GetParams()
{
Ebm.ResetParams();
Ebm.Params.Id = IdTextBox.Text.GetInt();
Ebm.Params.EmployeeCode = Ebm.GenerateEmployeeCode();
Ebm.Params.LastName = LastNameTextBox.Text;
Ebm.Params.FirstName = FirstNameTextBox.Text;
Ebm.Params.MiddleName = MiddleNameTextBox.Text;
Ebm.Params.GenderId = GenderBox.SelectedValue.GetInt();
Ebm.Params.BirthDate = BirthDatePicker.Value.GetDateTime();
Ebm.Params.Age = AgeTextBox.Text.GetInt();
Ebm.Params.Salary = SalaryTextBox.Text.GetDecimal();
Ebm.Params.StatId = 1;
if (PixPictureBox.Image != null)
{
Ebm.Params.Pics = ImageToByteArray(PixPictureBox.Image);
}
}
下面是我从数据库加载图片到PixPictureBox的方法
private Image ByteArrayToImage(byte[] bytesArr)
{
using (var memstr = new MemoryStream(bytesArr))
{
Image img = Image.FromStream(memstr);
return img;
}
}
这是我加载它的方式:
private void LoadDetails()
{
IdTextBox.Text = Ebm.Item.Id.GetString();
EmployeeCodeTextBox.Text = Ebm.Item.EmployeeCode;
LastNameTextBox.Text = Ebm.Item.LastName;
FirstNameTextBox.Text = Ebm.Item.FirstName;
MiddleNameTextBox.Text = Ebm.Item.MiddleName;
GenderBox.SelectedValue = Ebm.Item.GenderId;
BirthDatePicker.Value = Ebm.Item.BirthDate;
AgeTextBox.Text = Ebm.Item.Age.GetString();
SalaryTextBox.Text = Ebm.Item.Salary.GetString();
try
{
PixPictureBox.Image = ByteArrayToImage(Ebm.Item.Pics);
}
catch (Exception ex)
{
PixPictureBox.Image = null;
}
}
我的 MemoryStream 也出现了这个错误,我认为这与异常有关:
我只需要将 ByteArrayToImage()
方法更改为:
private Image ByteArrayToImage(byte[] bytesArr)
{
var mem = new MemoryStream(bytesArr);
Image img = Image.FromStream(mem);
return img;
}
情况如下:
- 我可以用 PixPictureBox 中的图片保存 () 员工条目 到数据库。
- 如果我编辑员工条目并将图片从 有了新的 PixPictureBox,Update() 正常。
- 这就是错误所在,每当我编辑员工条目但不更改 PixPictureBox 的图像时,
Update()
方法会抛出以下异常:
$exception {"A generic error occurred in GDI+."} System.Runtime.InteropServices.ExternalException
此方法引发此错误:
private byte[] ImageToByteArray(Image imageIn)
{
using (var ms = new MemoryStream())
{
imageIn.Save(ms, imageIn.RawFormat);
return ms.ToArray();
}
}
这是我的 GetParams()
方法,其中使用了 ImageToByteArray
:
private void GetParams()
{
Ebm.ResetParams();
Ebm.Params.Id = IdTextBox.Text.GetInt();
Ebm.Params.EmployeeCode = Ebm.GenerateEmployeeCode();
Ebm.Params.LastName = LastNameTextBox.Text;
Ebm.Params.FirstName = FirstNameTextBox.Text;
Ebm.Params.MiddleName = MiddleNameTextBox.Text;
Ebm.Params.GenderId = GenderBox.SelectedValue.GetInt();
Ebm.Params.BirthDate = BirthDatePicker.Value.GetDateTime();
Ebm.Params.Age = AgeTextBox.Text.GetInt();
Ebm.Params.Salary = SalaryTextBox.Text.GetDecimal();
Ebm.Params.StatId = 1;
if (PixPictureBox.Image != null)
{
Ebm.Params.Pics = ImageToByteArray(PixPictureBox.Image);
}
}
下面是我从数据库加载图片到PixPictureBox的方法
private Image ByteArrayToImage(byte[] bytesArr)
{
using (var memstr = new MemoryStream(bytesArr))
{
Image img = Image.FromStream(memstr);
return img;
}
}
这是我加载它的方式:
private void LoadDetails()
{
IdTextBox.Text = Ebm.Item.Id.GetString();
EmployeeCodeTextBox.Text = Ebm.Item.EmployeeCode;
LastNameTextBox.Text = Ebm.Item.LastName;
FirstNameTextBox.Text = Ebm.Item.FirstName;
MiddleNameTextBox.Text = Ebm.Item.MiddleName;
GenderBox.SelectedValue = Ebm.Item.GenderId;
BirthDatePicker.Value = Ebm.Item.BirthDate;
AgeTextBox.Text = Ebm.Item.Age.GetString();
SalaryTextBox.Text = Ebm.Item.Salary.GetString();
try
{
PixPictureBox.Image = ByteArrayToImage(Ebm.Item.Pics);
}
catch (Exception ex)
{
PixPictureBox.Image = null;
}
}
我的 MemoryStream 也出现了这个错误,我认为这与异常有关:
我只需要将 ByteArrayToImage()
方法更改为:
private Image ByteArrayToImage(byte[] bytesArr)
{
var mem = new MemoryStream(bytesArr);
Image img = Image.FromStream(mem);
return img;
}