Click here to Skip to main content
Click here to Skip to main content

Loading an Image and Saving it into a database

By , 23 Aug 2011
Rate this:
Please Sign up or sign in to vote.
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) {
        //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)

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 !! PinmemberSunnykumar0831-Oct-11 21:21 
GeneralWhy won't you read directly the file content and write it in... PinmemberDNikolov29-Aug-11 23:10 
GeneralNice way to covert img object to byte array. Dear Amando can... Pinmembernaseer baloch29-Aug-11 20:09 
GeneralRe: naseer, you can use the following methods : public static cl... PinmemberArmando de la Torre30-Aug-11 7:11 
GeneralReason for my vote of 5 helpful!! PinmemberGPUToaster23-Aug-11 23:00 
GeneralReally great Pinmemberinf1n1te23-Aug-11 8:01 
GeneralThanks! PinsubeditorWalt Fair, Jr.23-Aug-11 6:03 
GeneralReason for my vote of 5 Good One!! Nice solution.. Pinmemberjawed.ace22-Aug-11 21:43 

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

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

| Advertise | Privacy | Mobile
Web04 | 2.8.140421.2 | Last Updated 23 Aug 2011
Article Copyright 2011 by Armando de la Torre
Everything else Copyright © CodeProject, 1999-2014
Terms of Use
Layout: fixed | fluid