| « | January 2026 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
| 公告 |
| 暂无公告... |
| Blog信息 |
|
blog名称: 日志总数:21 评论数量:94 留言数量:1 访问次数:145865 建立时间:2006年1月9日 |

| |
|
[Visual C++](二)VC保存和显示数据库图像(JPG、JPEG) 原创空间, 文章收藏, 软件技术
joinclear 发表于 2006/5/13 18:08:13 |
| 转载自: http://www.vclife.net/articles/article_view.asp?atlid=18
简述关键代码如下:
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; }
具体的程序请参考附带的例子,例子里面有详细的注释。 |
|
|