weixin_46205228 2021-07-21 14:39 采纳率: 0%
浏览 71

c++ 从数据库拿到二进制图片数据后(image),怎么显示到mfc控件上?

大致代码如下:
_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是可以读取到的

  • 写回答

1条回答 默认 最新

  • 关注
    
    参考:
    IPicture  *ppic = NULL;
    HRESULT  hr;
    hr = OleLoadPicturePath((CComBSTR)m_pic_path.GetBuffer(),(LPUNKNOWN)NULL,0,0,IID_IPicture,(LPVOID*)&ppic);
    if (SUCCEEDED(hr))
    {
        ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
        CDC* pdc = GetDC();
     
        OLE_XPOS_HIMETRIC xSrc = 0;  // 图片中当前显示区域的x
        OLE_YPOS_HIMETRIC ySrc  = 0;  // 图片中当前显示区域的y
        OLE_XSIZE_HIMETRIC cxSrc = m_pic_width; // 图片中当前显示区域的宽度
        OLE_YSIZE_HIMETRIC cySrc = m_pic_height; // 图片中当前显示区域的高度
        ppic->get_Width(&cxSrc);
        ppic->get_Height(&cySrc);
     
        ppic->Render(*pdc,0,0,m_pic_width, m_pic_height,0,cySrc,cxSrc,-cySrc,&rect);
     
        ppic->Release();
        ReleaseDC(pdc);
        ppic = NULL;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 7月21日

悬赏问题

  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂