看这篇文章之前建议先看一下下面这篇文章:
VC下显示位图的几种方法 http://blog.chinaunix.net/uid-607545-id-2088102.html或 http://blog.csdn.net/ply421600/article/details/6692967 和http://hi.baidu.com/vbcs003/item/efffa6e775cdf80d8d3ea89a或http://blog.csdn.net/eryadabendan/article/details/6749939
修改了一下-----VC下显示位图的几种方法 中 的/*******************通过读取位图文件来显示位图**********************/
既然是向数据库中添加位图信息,那么有必须明白我们的数据是以什么形式存放在数据库的,当然没有别的方法,只能是二进制了,所以在创建数据库的时候,一定要注意选择的字段的类型,不然是添加下进去的。(刚开始的时候,我就遇到了这个问题,费了好长时间才搞定的。Access中的字段定义为” OLE 对象”,sql2000中字义为image就行了。
void CTestDlg::OnButton2() //读取位图文件并显示在picture控件上
{
// TODO: Add your control notification handler code here
// CStatic *pStatic=(CStatic*)GetDlgItem(IDC_PHOTO);
//CClientDC dc(this);
CFileDialog fileDlg(TRUE,"bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"(*.bmp)|*.bmp||");
if (fileDlg.DoModal()!=IDOK)
{
return;
}
CString filePath=fileDlg.GetPathName();
CString strFileName=filePath;
//成位图信息BITMAPINFO
BITMAPINFO *bitmapinfo=NULL;
BYTE *BmpData=NULL;
CFile file;//读取位图信息
//设置文件的打开方式
if(!file.Open(strFileName,CFile::modeRead|CFile::typeBinary))
{
return;
}
//BITMAP文件头结构体
BITMAPFILEHEADER BitmapHead;
//读取位图文件头
if(file.Read(&BitmapHead,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))
{
MessageBox("读取文件头失败!");
return;
}
if(BitmapHead.bfType!=0x4d42)
{
MessageBox("对不起,您读取的不是位图文件!");
return;
}
//位图信息
BITMAPINFOHEADER BitmapInfo;
if(file.Read(&BitmapInfo,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))
{
MessageBox("读取位图信息失败!");
return;
}
if(BitmapInfo.biBitCount!=24)
{
MessageBox("对不起,当前程序只支持24位位图信息!");
return;
}
bitmapinfo=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)];
if(!bitmapinfo)
{
MessageBox("内存分配失败!");
return;
}
/*把BMP位图信息头中的数据读取到位图信息结构中去.*/
memcpy(bitmapinfo,&BitmapInfo,sizeof(BITMAPINFOHEADER));
/*用来得到位图文件的大小*/
DWORD dataByte=BitmapHead.bfSize-BitmapHead.bfOffBits;
BmpData=(BYTE*)new char[dataByte];
if(!BmpData)
{
MessageBox("内存分配失败!");
delete bitmapinfo;
delete BmpData;
return;
}
if(file.Read(BmpData,dataByte)!=dataByte)
{
MessageBox("读取位图数据失败!");
return;
}
file.Close();
CClientDC *pDC=new CClientDC(this);
pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC->GetSafeHdc(),200,0,BitmapInfo.biWidth,BitmapInfo.biHeight, 0,0,BitmapInfo.biWidth,BitmapInfo.biHeight,BmpData,bitmapinfo,DIB_RGB_COLORS,SRCCOPY);
}
///
void CTestDlg::OnButton1() //将通过文件读出来的位图信息存储到数据库中
{
// TODO: Add your control notification handler code here
char *pBuffer=m_pbufferBMP;
VARIANT varPic;
SAFEARRAY *pArray;
SAFEARRAYBOUND rgsabound[1];
if (pBuffer)
{
rgsabound[0].lLbound=0;
rgsabound[0].cElements=size;
pArray=SafeArrayCreate(VT_UI1,1,rgsabound);
char *byte;
SafeArrayAccessData(pArray,(void**)&byte);
for (long index=0;index<=size;++index)
{
byte=m_pbufferBMP;
}
SafeArrayUnaccessData(pArray);
varPic.vt=VT_ARRAY | VT_UI1;
varPic.parray=pArray;
}
try
{
m_pRecordset->AddNew();
m_pRecordset->PutCollect("id",_variant_t("1001"));
m_pRecordset->GetFields()->GetItem("photo")->AppendChunk(varPic);
MessageBox("add ok");
}
catch (_com_error e)
{