VC++讀取圖像數據顯示方法_第1頁
VC++讀取圖像數據顯示方法_第2頁
VC++讀取圖像數據顯示方法_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、對圖像數據的讀取顯示Visual C+中實現對圖像數據的讀取顯示在利用VC進行數據庫編程時,經常需要處理 數據庫中的圖像 數據,將該圖像從 數據庫中讀取岀來并顯示, 圖像數據與文本字段不同,它是作為OLE字段在數據庫中存儲,通過數據集對象的成員變量 自動交換得到 的圖像數據,得到的數據并不能直接顯示,如何處理圖像數據,一直是數據庫編程中的一個難點,目前關于VC進行數據庫編程的資料不少,但很少涉及圖像 數據的操作,筆者針對一現狀,結合自己開發的一個 項目,解決了如何顯示 數據庫中的圖像這一問題,本文以操作ACESS數據庫為例子,講解一下自己的實現思路,希望對愛好 VC編程的朋友們有所幫助,以起到

2、拋磚引玉的作用。為了簡化問題,該數據庫的表中只有一個名為Images的OLE字段,我使用DAO連接操作數據庫, 讀取的圖像數據顯示在一個對話框上,至于使用ODBC、DAO還是ADO,這要根據具體情況而定,但無論使用哪一種,對圖像的顯示來說,實現的過程是大同小異的。由于篇幅有限,文章中對如何實現數據庫的連接不再作具體的說明,有興趣的讀者朋友可以參考VC數據庫編程的資料。實現過程中,首先定義一個 CDaoRecordset 的子類 CimageData 如下:class CimageData : public CDaoRecordsetpublic:CimageData (CDaoDatabase

3、* pDatabase = NULL);DECLARE_DYNAMIC(CimageData)file:/AFX_FIELD(CimageData, CDaoRecordset)CByteArray m_Images;/聲明字節數組用來存放圖像 數據file:/AFX_FIELD/ Overrides/ ClassWizard generated virtual function overridesfile:/AFX_VIRTUAL(CimageData)public:virtual CString GetDefaultDBName();virtual CString GetDefaultSQ

4、L();virtual void DoFieldExchange(CDaoFieldExchange* pFX);file:/AFX_VIRTUAL該類的實現為:CimageData: CimageData (CDaoDatabase* pdb):CDaoRecordset(pdb)file:/AFX_FIELD _l NIT(CimageData)m_nFields = 1;/數據庫的表中僅有一個字段file:/AFX_FIELD _l NITm_nDefaultType = dbOpenDynaset;/以動態集方式打開 數據庫CString CimageData:GetDefaultDB

5、Name()return _T(E:IMAGES.mdb); 默認的 ACESS 數據庫在 E 盤,名為 IMAGESCString CimageData:GetDefaultSQL() return _T(Table);默認打開 數據庫中名為Table的表void CimageData:DoFieldExchange(CDaoFieldExchange* pFX) file:/AFX_FIELD_MAP(CimageData) pFX-SetFieldType(CDaoFieldExchange:outputColumn);DFX_Binary(pFX, _T(Images), m_Imag

6、es);/ 以二進制方式在 Images 字段和 m_Images 變量間交換數據 file:/AFX_FIELD_MAP有了該類,就可以定義相應的對象來與數據庫中的圖像字段交換數據,下面定義的函數GetImageData() 說明了如何根據讀取的 OLE字段數據生成待顯示的圖像,需要注意的是該函數中使用的 CBitmap類的變量 Bitmap是預定義的一個全局變量:BOOL CImageDlg: GetImageData(CByteArray & DBArray)CByteArray Array;Array.Copy( DBArray);int HeaderLen = 78 + sizeof

7、(BITMAPFILEHEADER); file:/確定圖像頭信息的起始位置Array.RemoveAt( 0, HeaderLen ); /移動到圖像頭信息的起始位置BITMAPINFOHEADER & bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData();BITMAPINFO & bmInfo = *(LPBITMAPINFO)Array.GetData();file:/得到圖像數據的頭信息int nColors=bmiHeader.biClrUsed ? bmiHeader.biCIrUsed : 1 8 ) lpDIBBits=(LPVOID

8、)(LPDWORD)(bmlnfo.bmiColors+bmlnfo.bmiHeader.biClrUsed)+ (bmlnfo.bmiHeader.biCompression = BI_BITFIELDS) ? 3 : 0);elselpDIBBits = (LPVOID)(bmlnfo.bmiColors + nColors);file:/得到圖像各個像素的具體數據CClientDC dc(NULL);HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,&bmiHeader,CBMNIT,IpDIBBits,& bmlnfo.DIB_RGB_COLORS);fi

9、le:/生成位圖句柄Bitmap.Attach( hBmp );/將該句柄與定義的 Bitmap對象聯系在一起Array.RemoveAII(); file:/ 釋放內存return TRUE;有了上面的準備工作,現在可以實現圖像的顯示函數了,其實現如下:void ClmageDlg:OnShowlmage()CimageData db;定義記錄集對象db.Open();打開數據庫GetlmageData(db.m_lmages);根據記錄集對象的成員變量生成圖像對象file:/以下是在對話框的固定區域顯示圖像CPaintDC dc(this);if (!(Bitmap.m_hObject = NULL) CDC dcMem;dcMem.CreateCompatibleDC( &dc ); file:/create a Memory ImageCBitmap* pbmpOld ;BITMAP BmpSize ;Bitmap.GetBitmap(&BmpSize); file:/get Image SizepbmpOld = dcMem.SelectObject(&Bitmap);dc.StretchBlt( 20, 20, 200,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論