Storing "Paint Brush" images in a Access DB

This example demonstrates how to store a "Paint Brush" image in a Access DB. In my code I have created a CDaoRecordset derived class for handling and reading the binary data. Class Wizard binds a CLongBinary to the Ole Object field when creating the recordset. CLongBinary is difficult to manage, so in the recordset, that is to receive the binary data, I bind a CByteArray variable to the field.

Example :

::DoFieldExchange(CDaoFieldExchange* pFX) 

DFX_LongBinary(pFX, _T("[Images]"), m_Images);

become

DFX_Binary(pFX, _T("[Images]"), m_Images); 

In CDAORecordSet the public member "CLongBinary m_Images" become "CByteArray m_Images"

The function code is :
BOOL CBLOBSDlg::ReadFromBLOB(CByteArray & DBArray) 
{ 
  CByteArray Array; 
  Array.Copy( DBArray); 
  // the header of BLOB is OLE stuff like "Paint Brush Application" .... ecc.. 
  // the len is 78 byte ( I do not know for other headers ) 
  int HeaderLen =   78 + sizeof(BITMAPFILEHEADER); 
  Array.RemoveAt( 0, HeaderLen ); // I cut all Headers 
  
  // some BMP information 
  BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData() ; 
  BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ; 
  
  
  // If bmiHeader.biClrUsed is zero we have to infer the number 
  // of colors from the number of bits used to specify it. 
  int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount; 

  LPVOID lpDIBBits; 
  if( bmInfo.bmiHeader.biBitCount > 8 ) 
      lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) + 
                        ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0)); 
  else 
      lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors); 
  

  CClientDC dc(NULL); 
  
  HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,   // handle to device context 
                                 &bmiHeader,     // pointer to bitmap size and format data 
                                 CBM_INIT,       // initialization flag 
                                 lpDIBBits,      // pointer to initialization data 
                                 &bmInfo,        // pointer to bitmap color-format data 
                                 DIB_RGB_COLORS);                // color-data usage 
  
  OleBmp.Attach( hBmp ); 

  Array.RemoveAll(); //Relese Memory 

  return TRUE; 
} 

Note:

1: In the example the DB path in "CString CDaoRecorset::GetDefaultDBName()" must be changed!!

2: This code is for VC++ 5

Download source - 36KB

Update regarding storing a BLOB in an Access DB:
Download Project including saving BLOB - 60 KB

Date updated : 12 Feb. 1999



Comments

  • tee shirt diesel homme tee shirt perso

    Posted by efmzboyt on 03/19/2013 08:10am

    ÿþ

    Reply
  • tee shirt handball tee shirt dinosaure

    Posted by nnzzqzzl on 03/18/2013 05:56am

    ÿþ

    Reply
  • impression de tee shirt pas cher tee shirt creation

    Posted by miqjijyz on 03/17/2013 10:39pm

    ÿþ

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • A majority of organizations are operating under the assumption that their network has already been compromised, or will be, according to a survey conducted by the SANS Institute. With many high profile breaches in 2013 occurring on endpoints, interest in improving endpoint security is top-of-mind for many information security professionals. The full results of the inaugural SANS Endpoint Security Survey are summarized in this white paper to help information security professionals track trends in endpoint …

  • Packaged application development teams frequently operate with limited testing environments due to time and labor constraints. By virtualizing the entire application stack, packaged application development teams can deliver business results faster, at higher quality, and with lower risk.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds