求大佬帮忙!!我从SQLserver数据库中提取出的图片信息转换之后表头不是图片

有情有义阿德利 2020-03-25 08:30:23

//下面是我从数据库中提取图片信息的代码

char *pBuff = NULL;//用于存放位图的内存空间

try

{

if (m_pRecordset != NULL)
{
m_pRecordset->Close();
}
//m_pRecordset->Open(bstrRecordset,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM Table_1",
_variant_t((IDispatch *)m_pConnection, true),
adOpenDynamic, adLockPessimistic, adCmdText);

/*_bstr_t bstrSQL;
bstrSQL = "select*from photo";
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);*/
long DataSize;//在数据库中读取出来的位图的大小
m_pRecordset->MoveLast();//移动到记录最后,保证最新数据
DataSize = m_pRecordset->Fields->GetItem("photo")->ActualSize;//得到位图字段的大小

if (DataSize > 0)//判断那个位图字段是否为空
{

_variant_t TheValue;//存储读出来的数据

TheValue = m_pRecordset->GetFields()->GetItem("photo")->GetChunk(DataSize);//读取字段一
//TheValue=m_pRecordset->GetCollect("photo");
if (TheValue.vt == (VT_ARRAY | VT_UI1))
{
pBuff = new char[DataSize + 1];
if (pBuff)
{
char *buff = NULL;

SafeArrayAccessData(TheValue.parray, (void**)&buff);//把位图数据放到buff中去
memcpy(pBuff, buff, DataSize);//把位图数据放到pBuff中

SafeArrayUnaccessData(TheValue.parray);//释放

m_pBMPBuffer = new char[DataSize + 1];//开辟符数组
memcpy(m_pBMPBuffer, pBuff, DataSize);

HBITMAP hBitmap = NULL;//定义一个HBITMAP对象,用于显示位图用
LPSTR hDIB, lpBuffer = m_pBMPBuffer;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;
DWORD bmfHeaderLen;

//获得位图的头信息
bmfHeaderLen = sizeof(bmfHeader);
//strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);
memcpy(&bmfHeader, lpBuffer, bmfHeaderLen);
//根据获得的信息头判断是否是位图
if (bmfHeader.bfType != (*(WORD*)"BM"))
{
AfxMessageBox(_T("this is not bitmap!"));
return;
}
//获取位图数据
hDIB = lpBuffer + bmfHeaderLen;//将指针移动到文件头的后面
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB;
lpDIBBits = (lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;//偏移字节数

//创建位图
CClientDC dc(this);
hBitmap = CreateDIBitmap(dc.m_hDC, &bmiHeader,
CBM_INIT, lpDIBBits, &bmInfo, DIB_RGB_COLORS);


//显示位图
CBitmap bmp;//定义位图变量
bmp.Attach(hBitmap);
BITMAP bm;//定义一个位图结构
bmp.GetBitmap(&bm);
CDC dcMem;
dcMem.CreateCompatibleDC(GetDC());//创建一个兼容的DC
CBitmap *poldBitmap = (CBitmap*)dcMem.SelectObject(bmp); //将位图选入设备环境类
CRect lRect;//定义一个区域
CStatic *pstatic = (CStatic*)GetDlgItem(IDC_STATIC_pp);
pstatic->GetClientRect(&lRect);//获取控件的客户区域
lRect.NormalizeRect();

pstatic->GetDC()->StretchBlt(lRect.left, lRect.top, lRect.Width(), lRect.Height(),
&dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); //显示位图
dcMem.SelectObject(&poldBitmap); //将原有的句柄选入设备环境
bmp.DeleteObject();

/*cv::Mat img;
if (HBitmapToMat(hBitmap, img))
{
DrawMat1(img, IDC_STATIC_pp);
MessageBox(_T("成功"));
}
else
{
MessageBox(_T("转换失败"));
}*/

}
}
}
}
catch (_com_error e)

{
AfxMessageBox(e.Description());
//MessageBox(_T("打开数据表失败!"));

return;

}

调试之后错误的信息显示
求大佬们教教我
...全文
73 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2020-03-26
  • 打赏
  • 举报
回复

4,012

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧