VC保存和显示数据库图像(JPG、JPEG)

源码下载:http://download.csdn.net/source/2840272

程序运行界面显示如下:


简述关键代码如下:

 

1、保存图片数据到数据库

以下是代码片段:
//JPG图片保存到数据库
    try
    {
        _RecordsetPtr    pRecordset;
        pRecordset.CreateInstance(__uuidof(Recordset));
        pRecordset->Open("SELECT * FROM jpg",_variant_t((IDispatch*)pConnection),adOpenStatic,adLockOptimistic,adCmdText);
        pRecordset->AddNew();
        pRecordset->Fields->Item["jpgid"]->Value = (_variant_t)m_JPGId;//jpgid
        VARIANT pvList;
        SetPictureToVariant(pvList,(unsigned char *)m_pJPGBuffer);
        pRecordset->Fields->Item["jpgimage"]->AppendChunk(pvList); //JPG图像文件
        VariantClear(&pvList);
        
        pRecordset->Update();
        pRecordset->Close();
        AfxMessageBox("JPG图像保存成功!");
        m_JPGId == "";
        UpdateData(false);
    }
    catch(...)
    {
        AfxMessageBox("数据库读取失败");
        return;
    }

 

其中SetPictureToVariant如下:

以下是代码片段:
void CBMPinDBDlg::SetPictureToVariant(VARIANT &pvList, unsigned char *sPicture)
    {
        SAFEARRAYBOUND saBound[1];
        saBound[0].cElements = m_nFileLen;
        saBound[0].lLbound = 0;
        SAFEARRAY *pSA = SafeArrayCreate(VT_UI1, 1, saBound);    
        for (long l = 0; l < (long)m_nFileLen; l ++)
        {
            SafeArrayPutElement( pSA, &l, (void*)&sPicture[l]);        
        }
        VariantClear(&pvList);
        pvList.vt = VT_UI1 | VT_ARRAY;
        pvList.parray = pSA;
    }

 

2、从数据库读取图像文件并且显示在界面

   

以下是代码片段:
 //从数据库里取JPG图像文件
    try
    {
        _RecordsetPtr    pRecordset;
        char sSql[129];
        sprintf(sSql,"SELECT *FROM jpg WHERE jpgid=’%s’",m_JPGId);
        pRecordset.CreateInstance(__uuidof(Recordset));
        pRecordset->Open(sSql,_variant_t((IDispatch*)pConnection),adOpenStatic,adLockOptimistic,adCmdText);
        if (pRecordset->adoEOF)
        {
            CString str;
            str.Format("没有JPGid为: %s 的JPG图像!",m_JPGId );
            AfxMessageBox(str);
            Invalidate();
            m_JPGId = "";
            UpdateData(false);
            m_EidtJPGId.SetFocus();
            return;
        }
        _variant_t pvList ;        
        long lDataSize = pRecordset->GetFields()->GetItem("jpgimage")->ActualSize;
        m_nFileLen = (DWORD)lDataSize;
        if(lDataSize > 0)
        {
            _variant_t            varBLOB;
            varBLOB = pRecordset->GetFields()->GetItem("jpgimage")->GetChunk(lDataSize);
            //把二进制格式的图片转为图片格式
            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);
                        m_nFileLen = lDataSize;
                        
                        //m_pJPGBuffer -> pPicture                    
                        HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, m_nFileLen );
                        LPVOID lpBuf = ::GlobalLock( hMem );                    
                        memcpy(lpBuf,m_pJPGBuffer,m_nFileLen);
                        
                        ::GlobalUnlock( hMem );
                        
                        if ( CreateStreamOnHGlobal( hMem, TRUE, &pStream ) !=S_OK )     
                            return ;
                        
                        if ( OleLoadPicture( pStream, m_nFileLen, TRUE, IID_IPicture, ( LPVOID * )&pPicture ) !=S_OK )
                            return ;
                        
                        Invalidate();//在界面显示                 
                    }
                }
            }
            catch(...)
            {
                AfxMessageBox("从数据库中读取jpg图像有错!");
                return;
            }
            
        }
        
    }
    catch(...)
    {
        AfxMessageBox("数据库读取失败");
        return;
    }

具体的程序请参考附带的例子,例子里面有详细的注释。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

joinclear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值