Click here to Skip to main content
15,120,477 members
Articles / Database Development
Tip/Trick
Posted 23 Aug 2011

Stats

28K views
9 bookmarked

Loading an Image and Saving it into a database

Rate me:
Please Sign up or sign in to vote.
4.92/5 (9 votes)
23 Aug 2011CPOL
How to load an image from the filesystem and save it into a Database
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
C#
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.
C#
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
C#
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.
C#
private void btnLoad_Click(object sender, EventArgs e) {
  OpenFileDialog dlg = new OpenFileDialog();
  DialogResult dr = dlg.ShowDialog();
  if (dr == DialogResult.OK) {
    //Create the file-locked bitmap
    Bitmap b1 = new Bitmap(dlg.FileName);
    //Copy it into the picture image
    pbPicture.Image = (Bitmap)b1.Clone();
    //Say "Hasta la vista baby" to the file-locked bitmap
    b1.Dispose();
  }
}

Happy image saving !!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Armando de la Torre
Software Developer (Senior) Self-employed
Mexico Mexico
Senior SAP Consultant ( ABAP / MM / Workflow ).
Delphi Developer
C# Asp Developer

Comments and Discussions

 
GeneralReason for my vote of 5 Very nice solution, Thanks !! Pin
Sunny_Kumar_31-Oct-11 22:21
MemberSunny_Kumar_31-Oct-11 22:21 
GeneralWhy won't you read directly the file content and write it in... Pin
DNikolov30-Aug-11 0:10
MemberDNikolov30-Aug-11 0:10 
GeneralNice way to covert img object to byte array. Dear Amando can... Pin
naseer baloch29-Aug-11 21:09
Membernaseer baloch29-Aug-11 21:09 
GeneralRe: naseer, you can use the following methods : public static cl... Pin
Armando de la Torre30-Aug-11 8:11
MemberArmando de la Torre30-Aug-11 8:11 
GeneralReason for my vote of 5 helpful!! Pin
GPUToaster™24-Aug-11 0:00
MemberGPUToaster™24-Aug-11 0:00 
Reason for my vote of 5
helpful!!
GeneralReally great Pin
inf1n1te23-Aug-11 9:01
professionalinf1n1te23-Aug-11 9:01 
GeneralThanks! Pin
Dr.Walt Fair, PE23-Aug-11 7:03
professionalDr.Walt Fair, PE23-Aug-11 7:03 
GeneralReason for my vote of 5 Good One!! Nice solution.. Pin
jawed.ace22-Aug-11 22:43
Memberjawed.ace22-Aug-11 22:43 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.