As part of a project I required to load an image, display it in a picture box and save it into a database. Quite simple really ( at least in theory ).
The whole process can be summarized in the following steps:
1.Load the image file into a picture box
private void btnBadLoad_Click(object sender, EventArgs e) {
OpenFileDialog dlg = new OpenFileDialog();
DialogResult dr = dlg.ShowDialog();
if (dr == DialogResult.OK) {
pbPicture.Load(dlg.FileName);
}
}
2.Convert the image from the picture box into an array of bytes using a stream.
private byte[] ImageToByteArray(Image img,ImageFormat format) {
byte[] result;
try {
MemoryStream ms = new MemoryStream();
img.Save(ms , format);
result = ms.ToArray();
} catch (Exception ex) {
Console.Write(ex.StackTrace);
throw;
}
return result;
}
3.Create an insert command and pass the byte array as a parameter
DbCommand cmd = _dbu.CreateTextCommand(insQ);
cmd.AddParameter("@ImageId", id);
cmd.AddParameter("@ImageData", imageBytes);
cmd.ExecuteNonQuery();
During step 2 a rather obnoxious "Generic GDI+ Exception" appeared without apparent reason.After some research I found this is a designed behavior, as described in the following article.
http://support.microsoft.com/?id=814675
Apparently when an image is created from a file it gets locked allong with the file and no further streaming is possible.
The solution to this quandary is to change the way the image is loaded in step 1, disposing of the file-locked bitmap as fast as possible.
private void btnLoad_Click(object sender, EventArgs e) {
OpenFileDialog dlg = new OpenFileDialog();
DialogResult dr = dlg.ShowDialog();
if (dr == DialogResult.OK) {
Bitmap b1 = new Bitmap(dlg.FileName);
pbPicture.Image = (Bitmap)b1.Clone();
b1.Dispose();
}
}
Happy image saving !!