Storing "Paint Brush" images in a Access DB

WEBINAR:

REGISTER >

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

  • There are no comments yet. Be the first to comment!

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

Top White Papers and Webcasts

  • As all sorts of data becomes available for storage, analysis and retrieval - so called 'Big Data' - there are potentially huge benefits, but equally huge challenges...
  • The agile organization needs knowledge to act on, quickly and effectively. Though many organizations are clamouring for "Big Data", not nearly as many know what to do with it...
  • Cloud-based integration solutions can be confusing. Adding to the confusion are the multiple ways IT departments can deliver such integration...

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date