1。jpeg在数据库中是否以二进制方式存储?
2。若是以二进制方式存储,读出时怎样在视图上显示?
   我知道一种读数据库中位图的方法,读出来后显示是用CreateDIBitmap函数得到HBITMAP.但是显示jpeg又怎样做呢??   还望哪位大虾指点,不甚感激!!

解决方案 »

  1.   

    就没有人成功的从数据库中读出并显示出jpeg图片吗?
    这种用途应该是很广的啊。。
      

  2.   

    数据库中读取图片数据
    HRESULT   hr;
    HDC hdc;
    char *pBuf;
    VARIANT varBLOB;
    VARIANT rgvValues;
    BSTR Bstr1;
    long lDataSize;
    HGLOBAL hpalmem;
    LPBITMAPINFO lpbmi;
    LPLOGPALETTE lplogpal;
    HPALETTE hpal;
    const void *lpbit;
    COleVariant rValueData;
    hr=CoInitialize(NULL);
    CString Constr,wCmdString,tempstr;
    CComPtr<ADOField> pField;
    if(FAILED(hr))
    m_Conn = NULL;
    m_Rec = NULL;
    pFields = NULL;
    hr = ::CoCreateInstance((REFCLSID)CLSID_CADOConnection,NULL,CLSCTX_INPROC_SERVER,\
    (REFIID)IID_IADOConnection,(LPVOID*)&m_Conn);
    if (FAILED(hr))
    return ;
    hr = ::CoCreateInstance((REFCLSID)CLSID_CADORecordset,NULL,CLSCTX_INPROC_SERVER,\
    (REFIID)IID_IADORecordset,(LPVOID*)&m_Rec);
    if (FAILED(hr))
    return ;
    tempstr="f:\\练习\\MyApp\\数据库\\oleado\\oleado.mdb";
    Constr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+tempstr+";Persist Security Info=False";
    hr = m_Conn->Open(CComBSTR(Constr),CComBSTR(""),CComBSTR(""),adOpenUnspecified);
    if (FAILED(hr))
    {
    ::AfxMessageBox("连接数据库错误!");
    return ;
    }
    wCmdString=_T("select * from userphoto");//
    hr = m_Rec->Open(CComVariant(wCmdString),CComVariant(m_Conn),adOpenKeyset,adLockOptimistic,adCmdText);
    if (FAILED(hr))
    {
    ::AfxMessageBox("打开表错误!");
    return ;
    }
    m_Rec->get_Collect(CComVariant(1),rValueData);
    Bstr1= (_bstr_t) rValueData;
    m_UserName.Format("%s",(CString)Bstr1);
    rValueData.Clear(); 
    m_Rec->get_Collect(CComVariant(2),rValueData);    ///为新记录填充username字段
    m_UseOld=rValueData.intVal;
    pField=NULL;
    m_Rec->get_Fields(&pFields);//加入BLOB类型的数据
    pFields->get_Item(CComVariant(3),&pField);
    pField->get_ActualSize(&lDataSize);
    // long lDataSize = m_Rec->GetFields()->GetItem("photo")->ActualSize;///得到数据的长度
    if(lDataSize > 0)
    {
    rgvValues.vt = VT_ERROR;
    rgvValues.scode = DISP_E_PARAMNOTFOUND;
     //  _variant_t varBLOB;
     pField->GetChunk(lDataSize,&varBLOB);
    if(varBLOB.vt == (VT_ARRAY | VT_UI1))                                 ///判断数据类型是否正确
    {
    SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);              ///得到指向数据的指针
    /*****在这里我们可以对pBuf中的数据进行处理*****/
    SafeArrayUnaccessData (varBLOB.parray);
    }
    }
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); 
    LPVOID pvData = NULL; 
    if (hGlobal != NULL) 

    if ((pvData = GlobalLock(hGlobal)) != NULL) 

    file.ReadHuge(pvData, lDataSize ); 
    GlobalUnlock(hGlobal); 
    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);  if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic))) 

    OLE_XSIZE_HIMETRIC hmWidth; 
    OLE_YSIZE_HIMETRIC hmHeight;  pPic->get_Width(&hmWidth); 
    pPic->get_Height(&hmHeight); // double fX,fY; 
    // fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0); 
    // fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0); 
    // if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) 
    double fX,fY; 
    fX = 640;
    fY = 480;
    if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))  AfxMessageBox("Failed To Render The picture!"); 
    pPic->Release(); 

    else 
    AfxMessageBox("Error Loading Picture From Stream!"); 



    else 
    AfxMessageBox("Can't Open Image File!");这样就OK了 你试试
      

  3.   

    1.在数据库中怎么存储的要问存的人,一般来说是把一个JPEG文件直接读出来,然后存到数据库的bin或Image类型的字段中。如果你把它读出来,存成以jpg为后缀的文件能用IE打开,那就对了。
    2.至于显示jpeg文件,那是个非常复杂的问题,因为里面牵涉到文件版本,图像解压等问题。一般来说需要第三方的软件。自己写是非常困难的。
      

  4.   

    To mfkzj() :
      >>file.ReadHuge(pvData, lDataSize ); 
    file对象还未创建。此处编译不通。。
      

  5.   

    To mfkzj() :
       请把你的源代码发一份给我,很急!!
      

  6.   

    To mfkzj() :
       请把你的源代码发一份给我,很急!!