ADO 从ACCESS数据库读取图片并显示出来
2011-07-28 16:45
351 查看
try
{
//获得文件的大小
long nSize = theApp.m_pRecordset->GetFields()->GetItem("Data")->ActualSize;
if(nSize <= 0)
{
return;
}
_variant_t varBLOB;
varBLOB = theApp.m_pRecordset->GetFields()->GetItem("Data")->GetChunk(nSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(BYTE *pBuffer = new BYTE [nSize+1]) ///重新申请必要的存储空间
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(pBuffer,pBuf,nSize); ///复制数据到缓冲区m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);
CDC* pDC;
IPicture *pPic;
IStream *pStm;
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,nSize);
LPVOID pvData = NULL;
if(hGlobal != NULL)
{
if((pvData = GlobalLock(hGlobal)) != NULL)
{
memcpy(pvData,pBuf,nSize);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);
if(SUCCEEDED(OleLoadPicture(pStm,nSize,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic-> get_Width(&hmWidth);
pPic-> get_Height(&hmHeight);
CRect rect;
//获取控件相对于屏幕的位置
GetDlgItem(IDC_SHOW)->GetWindowRect(&rect);
//转化为相对于控件的位置
ScreenToClient(rect);
double fX,fY;
fX =rect.Width();
fY =rect.Height();
pDC=GetDC();
if(FAILED(pPic-> Render(*pDC,rect.TopLeft().x,rect.TopLeft().y,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox( "图片显示失败! ");
pPic-> Release();
}
else
AfxMessageBox( "加载图片失败! ");
}
}
delete [] pBuffer;
pBuf=0;
}
}
}
catch (_com_error e) {
// ::MessageBox(NULL,(LPCTSTR)e.Description(),"",MB_OK);
}
{
//获得文件的大小
long nSize = theApp.m_pRecordset->GetFields()->GetItem("Data")->ActualSize;
if(nSize <= 0)
{
return;
}
_variant_t varBLOB;
varBLOB = theApp.m_pRecordset->GetFields()->GetItem("Data")->GetChunk(nSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(BYTE *pBuffer = new BYTE [nSize+1]) ///重新申请必要的存储空间
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(pBuffer,pBuf,nSize); ///复制数据到缓冲区m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);
CDC* pDC;
IPicture *pPic;
IStream *pStm;
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,nSize);
LPVOID pvData = NULL;
if(hGlobal != NULL)
{
if((pvData = GlobalLock(hGlobal)) != NULL)
{
memcpy(pvData,pBuf,nSize);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);
if(SUCCEEDED(OleLoadPicture(pStm,nSize,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic-> get_Width(&hmWidth);
pPic-> get_Height(&hmHeight);
CRect rect;
//获取控件相对于屏幕的位置
GetDlgItem(IDC_SHOW)->GetWindowRect(&rect);
//转化为相对于控件的位置
ScreenToClient(rect);
double fX,fY;
fX =rect.Width();
fY =rect.Height();
pDC=GetDC();
if(FAILED(pPic-> Render(*pDC,rect.TopLeft().x,rect.TopLeft().y,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox( "图片显示失败! ");
pPic-> Release();
}
else
AfxMessageBox( "加载图片失败! ");
}
}
delete [] pBuffer;
pBuf=0;
}
}
}
catch (_com_error e) {
// ::MessageBox(NULL,(LPCTSTR)e.Description(),"",MB_OK);
}
相关文章推荐
- 读取图片,并通过鼠标交互,在图片上选择一块矩形区域,然后把这个矩形区域的子图像显示出来
- 从指定的路径中读取图片,并显示出来
- 使用asp.net将图片上传并存入SqlServer中,然后从SqlServer中读取并显示出来
- android:读取SD卡中的图片显示出来(缩略图),SD卡工具类(13)
- 使用asp.net将图片上传并存入SqlServer中,然后从SqlServer中读取并显示出来
- C#把图片转换字节存入数据库在读取显示出来。
- flex :读取access数据库数据 转化为xml 然后在flex页面显示绑定图片
- 在android中用NetworkImageView读取网络图片并通过ListView显示出来
- 使用asp.net将图片上传并存入SqlServer中,然后从SqlServer中读取并显示出来
- Delphi以二进制方式读取图片并显示出来
- Metro中如何直接读取图片并显示出来。
- Form2.Image 控件显示ADO 读取的二进制图片
- [VB.NET]如何把一个图片保存到access中,又如何把它读取出来,并在picturebox中显示?
- Jsp 读取oracle数据库图片,显示出来
- opencv错误记录(2)opencv读取图片显示不出来
- OpenCv中批量读取图片数据并显示出来的C++程序
- 使用asp.net将图片上传并存入SqlServer中,然后从SqlServer中读取并显示出来
- 将数据库 二进制流 图片数据 显示出来
- 将图片插入数据库并使用asp.net读取出来的正确方
- js兼容火狐显示上传图片预览效果的方法(读取字节)