大致代码如下:
_variant_t varBLOB;
char *ImgBuffer = (_bstr_t)varBLOB;
varBLOB = m_pRecordset->GetFields()->GetItem(_variant_t(str1))->GetChunk(lDataSize);//获得image字段存下来的长度
IplImage * img_hope = cvCreateImageHeader(cvSize(640,480), IPL_DEPTH_8U,3);//试图将获得的数据转化为IplImage
cvSetData(img_hope,ImgBuffer,img_hope->widthStep);
try
{
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(m_pJPGBuffer = new char[lDataSize+1])
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(m_pJPGBuffer,pBuf,lDataSize);
SafeArrayUnaccessData (varBLOB.parray);
FileLen = lDataSize;
// m_pJPGBuffer -> pPicture
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, FileLen );
LPVOID lpBuf = ::GlobalLock( hMem );
memcpy(lpBuf,m_pJPGBuffer,FileLen);
DrawPicToHDC(img_hope,IDC_SQLCAPTURE1);//大概的逻辑就是这样,try后面的也是将数据保存下来的方式。
//这个是显示到控件上的代码
void CCameraOpenVCDemoDlg::DrawPicToHDC(IplImage * img, UINT ID)
{
CDC *pDC=GetDlgItem(ID)->GetDC();
HDC hDC=pDC->GetSafeHdc();
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
CCvvImage cimg;
cimg.CopyOf(img);
cimg.DrawToHDC(hDC,&rect);
ReleaseDC(pDC);
}
真的一点思路都没有了。有一点可以确定的是上传到数据库的数据一定是二进制流。使用grid++report是可以读取到的