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

More by Author

Must Read