这是我的代码,总是提示文件格式不正确,不知道是怎么回事,高手帮忙看下,谢谢!!
HBITMAP m_hBitmap;
long lDataSize = pRs->GetFields()->GetItem("Photo")->ActualSize;
char *m_pBuffer;
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB =pRs->GetFields()->GetItem("Photo")->GetChunk(lDataSize);
//varBLOB=pRs->GetCollect("Photo");
if(varBLOB.vt==(VT_ARRAY | VT_UI1))
{
if(m_pBuffer = new char[lDataSize+1])
{
char * pBuf=NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(m_pBuffer,pBuf,lDataSize);                   //复制数据到缓冲区m_pBuffer
SafeArrayUnaccessData(varBLOB.parray); LPSTR hDIB;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader; DWORD bmfHeaderLen;
bmfHeaderLen=sizeof(bmfHeader);
strncpy((LPSTR)&bmfHeader,(LPSTR)m_pBuffer,bmfHeaderLen);
if(bmfHeader.bfType!= (*(WORD *)"BM"))
{
MessageBox("BMP文件格式不正确");
return;
} hDIB=m_pBuffer+bmfHeaderLen;
BITMAPINFOHEADER &bmiHeader =*(LPBITMAPINFOHEADER)hDIB;
BITMAPINFO &bmInfo=*(LPBITMAPINFO)hDIB;
lpDIBBits=(m_pBuffer)+((BITMAPFILEHEADER *)m_pBuffer)->bfOffBits;
CClientDC dc(this);
m_hBitmap=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
delete []m_pBuffer;
}
}
}

解决方案 »

  1.   

    先看你写入数据库的bmp位图信息是否正确...然后看你是否正确读取出数据来
      

  2.   


    HBITMAP m_hBitmap; 
    long lDataSize = pRs->GetFields()->GetItem("Photo")->ActualSize; 
    char *m_pBuffer; 
    if(lDataSize > 0) 

        _variant_t varBLOB; 
        varBLOB =pRs->GetFields()->GetItem("Photo")->GetChunk(lDataSize); 
        //varBLOB=pRs->GetCollect("Photo"); 
        if(varBLOB.vt==(VT_ARRAY | VT_UI1)) 
        { 
            if(m_pBuffer = new char[lDataSize+1]) 
            { 
                char * pBuf=NULL; 
                SafeArrayAccessData(varBLOB.parray,(void **)&pBuf); 
                memcpy(m_pBuffer,pBuf,lDataSize);                  //复制数据到缓冲区m_pBuffer 
                SafeArrayUnaccessData(varBLOB.parray);             LPSTR hDIB; 
                LPVOID lpDIBBits; 
                BITMAPFILEHEADER bmfHeader;             DWORD bmfHeaderLen; 
                bmfHeaderLen=sizeof(bmfHeader); 
                strncpy((LPSTR)&bmfHeader,(LPSTR)m_pBuffer,bmfHeaderLen); 
                if(bmfHeader.bfType!= (*(WORD *)"BM")) 
                { 
                    MessageBox("BMP文件格式不正确"); 
                    return; 
                }             hDIB=m_pBuffer+bmfHeaderLen; 
                BITMAPINFOHEADER &bmiHeader =*(LPBITMAPINFOHEADER)hDIB; 
                BITMAPINFO &bmInfo=*(LPBITMAPINFO)hDIB; 
                lpDIBBits=(m_pBuffer)+((BITMAPFILEHEADER *)m_pBuffer)->bfOffBits; 
                CClientDC dc(this); 
                m_hBitmap=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS); 
                delete []m_pBuffer; 
            } 
        } 

    红色那行改成用 memcpy
    若果中间有'\0',使用strncpy会被截断,拷贝不倒bmfHeaderLen个字节
      

  3.   

    倒这个破系统又出问题了?怎么code中不能嵌套color了strncpy((LPSTR)&bmfHeader,(LPSTR)m_pBuffer,bmfHeaderLen); =>memcpy((void *)&bmfHeader,(const void *)m_pBuffer, bmfHeaderLen); 
      

  4.   

    Photo字段里面存储的是完整图象信息吗?
      

  5.   

    应该是完整的吧,存的时候我是通过文件对话框进行的选择,选择的是bmp格式的图片。
      

  6.   

    按照4楼的方法试了,好像还是不行啊,始终提示文件格式不正确,我现在怀疑是不是存进数据库的时候搞错了,这是存进去的代码,再帮我看看吧
    void CDialogPicture::OnBnClickedButtonSave()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData();
    if(m_strName.IsEmpty())
    {
    MessageBox("姓名不能为空","提示");
    m_edName.SetFocus();
    return;
    }
    char * m_pBuffer; //从BMP文件中读取的数据存放在此变量中
    CFile file;
    if(!file.Open(strPath,CFile::modeRead))                              //strPath是利用文件对话框获取的路径
    {
    MessageBox("文件无法打开");
    }
    DWORD m_filelen;         //用于保存文件长度
    m_filelen=file.GetLength();
    m_pBuffer=new char[m_filelen+1];    //根据文件长度分配数组空间 try
    {
    _ConnectionPtr pConn = NULL;
    _RecordsetPtr pRs = NULL;
    CString strSQL;
    CString strConnect = _T("Provider=SQLOLEDB.1; Data Source=") + theApp.m_strDBsrc + 
    _T("; Initial Catalog=") + theApp.m_strDBname  +
    _T("; User ID=") + theApp.m_strDBusr + 
    _T("; PWD=") + theApp.m_strDBpwd; if( FAILED( pConn.CreateInstance( __uuidof(Connection ) ) ) )
    { AfxMessageBox( "fdfdf" , MB_OK|MB_ICONEXCLAMATION, 0 ); ASSERT(pConn != NULL); return ;
    } if( FAILED( pRs.CreateInstance( __uuidof(Recordset ) ) ) )
    { AfxMessageBox( "fdfdsf" , MB_OK|MB_ICONEXCLAMATION, 0 ); ASSERT(pRs != NULL); return ;
    }
    pConn->Open(_bstr_t(LPCTSTR(strConnect)), "", "",adConnectUnspecified); strSQL.Format( _T("SELECT  * FROM picture")); pRs->PutCursorLocation(adUseClient); // 支持光标
    pRs->Open( _bstr_t(strSQL), _variant_t((IDispatch *)pConn, true), adOpenStatic, adLockOptimistic, adCmdText);
    pRs->AddNew();
    VARIANT varblob;
    SAFEARRAY *psa;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound=0;
    rgsabound[0].cElements=m_filelen;
    psa=SafeArrayCreate(VT_UI1,1,rgsabound);
    for(long i=0;i<(long)m_filelen;i++)
    {
    SafeArrayPutElement(psa,&i,m_pBuffer++);
    }
    varblob.vt=VT_ARRAY|VT_UI1;
    varblob.parray=psa;
    pRs->PutCollect("Name",(_variant_t)m_strName);
    pRs->GetFields()->GetItem("Photo")->AppendChunk(varblob); pRs->Update(); MessageBox("添加成功!");
    pRs->Close();
    pConn->Close();
    }
    catch(_com_error e)
    {
    MessageBox(e.Description());
    }}
      

  7.   

    你可以打印数据库barBlob数据出来,按照字节HEX打印。
    然后通过对比你的bmp hex,看看保存是否正确再说。
      

  8.   

    http://www.vckbase.com/vckbase/vckbase10/vc/nonctrls/database_07/1007003.htm