怎样读取ACCESS中的图片

本文介绍使用ADO从数据库中读取BMP图像数据的方法,包括获取图像大小、读取图像块并转换为HBITMAP的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用ADO:  
   
  void   CADOBlobDlg::ReadData()  
  {  
  //DestroyPhoto(); ///清除原图像  
  if(m_pRecordset->adoEOF||m_pRecordset->BOF)    
  {  
  m_UserName.Empty();  
  m_Old.Empty();  
  UpdateData(FALSE);  
  return;  
  }  
  long   lDataSize   =   m_pRecordset->GetFields()->GetItem("photo")->ActualSize;  
  if(lDataSize   >   0)  
  {  
  _variant_t varBLOB;  
  varBLOB   =   m_pRecordset->GetFields()->GetItem("photo")->GetChunk(lDataSize);  
  if(varBLOB.vt   ==   (VT_ARRAY   |   VT_UI1))  
  {  
  if(m_pBMPBuffer   =   new   char[lDataSize+1]) ///重新分配必要的存储空间  
  {  
  char   *pBuf   =   NULL;  
  SafeArrayAccessData(varBLOB.parray,(void   **)&pBuf);  
  memcpy(m_pBMPBuffer,pBuf,lDataSize); ///复制数据到缓冲区m_pBMPBuffer  
  SafeArrayUnaccessData   (varBLOB.parray);  
  m_nFileLen   =   lDataSize;  
  m_hPhotoBitmap   =   BufferToHBITMAP(); ///生成BITMAP对象  
  }  
  }  
  }  
  m_UserName   =   m_pRecordset->GetCollect("username").bstrVal;  
  m_Old.Format("%d",m_pRecordset->GetCollect("old").lVal);  
  m_editUserName.EnableWindow();  
  m_editOld.EnableWindow();  
  m_buttonSelectPhoto.EnableWindow();  
  m_buttonDeleteUser.EnableWindow();  
  UpdateData(FALSE);  
  }  
   
  ///////////将内存中的BMP文件内容转换到HBITMAP///////  
  HBITMAP   CADOBlobDlg::BufferToHBITMAP()  
  {  
  HBITMAP hBmp;  
  LPSTR hDIB,lpBuffer   =   m_pBMPBuffer;  
  LPVOID lpDIBBits;  
  BITMAPFILEHEADER bmfHeader;  
  DWORD bmfHeaderLen;  
   
  bmfHeaderLen   =   sizeof(bmfHeader);  
  strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);  
  if   (bmfHeader.bfType   !=   ((WORD)   ('M'   <<   8)   |   'B'))   return   NULL;  
  hDIB   =   lpBuffer   +   bmfHeaderLen;  
  BITMAPINFOHEADER   &bmiHeader   =   *(LPBITMAPINFOHEADER)hDIB   ;  
  BITMAPINFO   &bmInfo   =   *(LPBITMAPINFO)hDIB   ;  
  int   nColors   =   bmiHeader.biClrUsed   ?   bmiHeader.biClrUsed   :   1   <<   bmiHeader.biBitCount;    
  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(this);  
  hBmp   =   CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);  
  return   hBmp;  
  }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值