成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Visual C++中實現對圖像數據的讀取顯示

開發 后端
在利用VC進行數據庫編程時,經常需要處理數據庫中的圖像數據,將該圖像從數據庫中讀取出來并顯示,圖像數據與文本字段不同,它是作為OLE字段在數據庫中存儲,通過數據集對象的成員變量自動交換得到的圖像數據,得到的數據并不能直接顯示,如何處理圖像數據,一直是數據庫編程中的一個難點。

在利用VC進行數據庫編程時,經常需要處理數據庫中的圖像數據,將該圖像從數據庫中讀取出來并顯示,圖像數據與文本字段不同,它是作為OLE字段在數據庫中存儲,通過數據集對象的成員變量自動交換得到的圖像數據,得到的數據并不能直接顯示,如何處理圖像數據,一直是數據庫編程中的一個難點。

目前關于VC進行數據庫編程的資料不少,但很少涉及圖像數據的操作,筆者針對一現狀,結合自己開發的一個項目,解決了如何顯示數據庫中的圖像這一問題,本文以操作ACESS數據庫為例子,講解一下自己的實現思路,希望對愛好VC編程的朋友們有所幫助,以起到拋磚引玉的作用。

為了簡化問題,該數據庫的表中只有一個名為Images的OLE字段,我使用DAO連接操作數據庫,讀取的圖像數據顯示在一個對話框上,至于使用ODBC、DAO還是ADO,這要根據具體情況而定,但無論使用哪一種,對圖像的顯示來說,實現的過程是大同小異的。

由于篇幅有限,文章中對如何實現數據庫的連接不再作具體的說明,有興趣的讀者朋友可以參考VC數據庫編程的資料。實現過程中,首先定義一個CDaoRecordset的子類 CimageData如下:

  1. class CimageData : public CDaoRecordset  
  2. {  
  3. public:  
  4. CimageData (CDaoDatabase* pDatabase = NULL);  
  5. DECLARE_DYNAMIC(CimageData)  
  6. file://{{AFX_FIELD(CimageData, CDaoRecordset)  
  7. CByteArray m_Images;//聲明字節數組用來存放圖像數據  
  8. file://}}AFX_FIELD  
  9. // Overrides  
  10. // ClassWizard generated virtual function overrides  
  11. file://{{AFX_VIRTUAL(CimageData)  
  12. public:  
  13. virtual CString GetDefaultDBName();  
  14. virtual CString GetDefaultSQL();  
  15. virtual void DoFieldExchange(CDaoFieldExchange* pFX);  
  16. file://}}AFX_VIRTUAL 

該類的實現為:

  1. CimageData:: CimageData (CDaoDatabase* pdb)  
  2. : CDaoRecordset(pdb)  
  3. {  
  4. file://{{AFX_FIELD_INIT(CimageData)  
  5. m_nFields = 1;//數據庫的表中僅有一個字段  
  6. file://}}AFX_FIELD_INIT  
  7. m_nDefaultType = dbOpenDynaset;//以動態集方式打開數據庫  
  8. }  
  9. CString CimageData::GetDefaultDBName()  
  10. {  
  11. return _T("E:\\IMAGES.mdb");//默認的ACESS數據庫在E盤,名為IMAGES  
  12. }  
  13. CString CimageData::GetDefaultSQL()  
  14. {  
  15. return _T("[Table]");//默認打開數據庫中名為"Table"的表  
  16. }  
  17. void CimageData::DoFieldExchange(CDaoFieldExchange* pFX)  
  18. {  
  19. file://{{AFX_FIELD_MAP(CimageData)  
  20. pFX->SetFieldType(CDaoFieldExchange::outputColumn);  
  21. DFX_Binary(pFX, _T("[Images]"), m_Images);//以二進制方式在Images字段和m_Images變量間交換數據  
  22. file://}}AFX_FIELD_MAP  

 

有了該類,就可以定義相應的對象來與數據庫中的圖像字段交換數據,下面定義的函數GetImageData()說明了如何根據讀取的OLE字段數據生成待顯示的圖像,需要注意的是該函數中使用的CBitmap類的變量Bitmap是預定義的一個全局變量:

  1. BOOL CImageDlg:: GetImageData(CByteArray & DBArray)  
  2. {  
  3. CByteArray Array;  
  4. Array.Copy( DBArray);  
  5. int HeaderLen = 78 + sizeof(BITMAPFILEHEADER); file://確定圖像頭信息的起始位置  
  6. Array.RemoveAt( 0, HeaderLen ); // 移動到圖像頭信息的起始位置  
  7. BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData() ;  
  8. BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ;  
  9. file://得到圖像數據的頭信息  
  10. int nColors=bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 《 bmiHeader.biBitCount;  
  11. file://確定圖像的顏色數  
  12. LPVOID lpDIBBits;  
  13. if( bmInfo.bmiHeader.biBitCount > 8 )  
  14. lpDIBBits=(LPVOID)((LPDWORD)(bmInfo.bmiColors+bmInfo.bmiHeader.biClrUsed)+  
  15. ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));  
  16. else 
  17. lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);  
  18. file://得到圖像各個像素的具體數據  
  19. CClientDC dc(NULL);  
  20. HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,  
  21. &bmiHeader,  
  22. CBM_INIT,  
  23. lpDIBBits,  
  24. &bmInfo,  
  25. DIB_RGB_COLORS);  
  26. file://生成位圖句柄  
  27. Bitmap.Attach( hBmp );//將該句柄與定義的Bitmap對象聯系在一起  
  28. Array.RemoveAll(); file://釋放內存  
  29. return TRUE;  

有了上面的準備工作,現在可以實現圖像的顯示函數了,其實現如下:

  1. void CImageDlg::OnShowImage()  
  2. {  
  3. CimageData db;//定義記錄集對象  
  4. db.Open();打開數據庫  
  5. GetImageData(db.m_Images);//根據記錄集對象的成員變量生成圖像對象  
  6. file://以下是在對話框的固定區域顯示圖像  
  7. CPaintDC dc(this);  
  8. if (!(Bitmap.m_hObject == NULL))  
  9. { CDC dcMem;  
  10. dcMem.CreateCompatibleDC( &dc ); file://create a Memory Image  
  11. CBitmap* pbmpOld ;  
  12. BITMAP BmpSize ;  
  13. Bitmap.GetBitmap(&BmpSize); file://get Image Size  
  14. pbmpOld = dcMem.SelectObject(&Bitmap);  
  15. dc.StretchBlt( 20, 20, 200, 200, &dcMem, 0, 0, BmpSize.bmWidth, BmpSize.bmHeight, SRCCOPY);  
  16. dcMem.SelectObject( pbmpOld );  

以上代碼中使用的數據庫為ACESS97,程序在windows98、Visual C++6.0環境下編譯通過,運行正常。

【編輯推薦】

  1. VC++獲得當前系統時間的幾種方案
  2. MVC+jQuery開發B/S系統:表單提交
  3. 淺談怎樣加快C++代碼的編譯速度
  4. C/C++是程序員必須掌握的語言嗎?
  5. 再駁Linus:思科工程師對C++不得不說的事
責任編輯:于鐵 來源: 互聯網
相關推薦

2010-01-14 13:39:45

Visual C++優

2010-01-18 14:41:52

Visual C++開

2009-07-31 18:28:46

實現C#顯示圖像

2009-03-17 08:56:57

Visual StudVS2010C++

2010-01-11 11:02:59

Visual C++

2010-01-25 16:58:15

C++程序

2010-01-20 15:00:09

Visual C++開

2010-01-15 16:37:28

Visual C++

2010-01-18 15:40:37

Visual C++工

2010-01-15 14:52:33

Visual C++

2009-06-15 14:48:13

Visual C++本狀態管理

2010-01-22 13:59:34

Visual C++應

2010-01-13 14:35:10

Visual C++

2010-03-10 09:28:58

Visual Stud

2010-01-14 10:56:43

Visual C++

2010-01-12 14:16:31

Visual C++語

2010-02-01 13:26:58

C++讀取CSV文件

2009-11-12 10:05:09

Visual C++

2009-11-12 11:00:56

Visual C++

2010-01-20 09:54:27

C++數據類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品日 | 99在线播放 | 先锋资源在线 | 国产精品国产成人国产三级 | 天天插天天射天天干 | 久久成人精品 | 国产激情视频网 | 视频在线一区二区 | 国产精品日产欧美久久久久 | 国产精品久久二区 | 日本高清中文字幕 | 99reav| 欧美日韩中文国产一区发布 | 在线观看成人小视频 | 久久精品性视频 | 日韩有码一区二区三区 | 孰女乱色一区二区三区 | 亚洲欧美在线视频 | 日韩成人中文字幕 | 欧美成人自拍视频 | 精品96久久久久久中文字幕无 | 国产高清精品一区二区三区 | 天天射影院 | 国产精品污www在线观看 | 日韩视频在线播放 | 国产一级一级 | 久久久99国产精品免费 | 国产精品高清在线 | 成人综合一区 | 日本一区二区三区四区 | 日日碰狠狠躁久久躁婷婷 | 成人一级视频在线观看 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 日韩一区在线观看视频 | 久久伊人精品 | 国产一区二区精华 | 欧美在线日韩 | 久久久精 | 国产亚洲成av人片在线观看桃 | 精品九九 | 久久精品国产一区二区电影 |