亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > CSS > 正文

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

2024-07-11 09:00:40
字體:
來源:轉載
供稿:網友

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

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

  class CimageData : public CDaoRecordset

  {

  public:

  CimageData (CDaoDatabase* pDatabase = NULL);

  DECLARE_DYNAMIC(CimageData)

  file://{{AFX_FIELD(CimageData, CDaoRecordset)

  CByteArray m_Images;//聲明字節數組用來存放圖像數據

  file://}}AFX_FIELD

  // Overrides

  // ClassWizard generated virtual function overrides

  file://{{AFX_VIRTUAL(CimageData)

  public:

  virtual CString GetDefaultDBName();

  virtual CString GetDefaultSQL();

  virtual void DoFieldExchange(CDaoFieldExchange* pFX);

  file://}}AFX_VIRTUAL

  該類的實現為:

  CimageData:: CimageData (CDaoDatabase* pdb)

  : CDaoRecordset(pdb)

  {

  file://{{AFX_FIELD_INIT(CimageData)

  m_nFields = 1;//數據庫的表中僅有一個字段

  file://}}AFX_FIELD_INIT

  m_nDefaultType = dbOpenDynaset;//以動態集方式打開數據庫

  }

  CString CimageData::GetDefaultDBName()

  {

  return _T("E:IMAGES.mdb");//默認的ACESS數據庫在E盤,名為IMAGES

  }

  CString 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_Images);//以二進制方式在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(BITMAPFILEHEADER); file://確定圖像頭信息的起始位置

  Array.RemoveAt( 0, HeaderLen ); // 移動到圖像頭信息的起始位置

  BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData() ;

  BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ;

  file://得到圖像數據的頭信息

  int nColors=bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 《 bmiHeader.biBitCount;

  file://確定圖像的顏色數

  LPVOID lpDIBBits;

  if( bmInfo.bmiHeader.biBitCount > 8 )

  lpDIBBits=(LPVOID)((LPDWORD)(bmInfo.bmiColors+bmInfo.bmiHeader.biClrUsed)+

  ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));

  else

  lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);

  file://得到圖像各個像素的具體數據

  CClientDC dc(NULL);

  HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,

  &bmiHeader,

  CBM_INIT,

  lpDIBBits,

  &bmInfo,

  DIB_RGB_COLORS);

  file://生成位圖句柄

  Bitmap.Attach( hBmp );//將該句柄與定義的Bitmap對象聯系在一起

  Array.RemoveAll(); file://釋放內存

  return TRUE;

  }

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

  void CImageDlg::OnShowImage()

  {

  CimageData db;//定義記錄集對象

  db.Open();打開數據庫

  GetImageData(db.m_Images);//根據記錄集對象的成員變量生成圖像對象

  file://以下是在對話框的固定區域顯示圖像

  CPaintDC dc(this);

  if (!(Bitmap.m_hObject == NULL))

  { CDC dcMem;

  dcMem.CreateCompatibleDC( &dc ); file://create a Memory Image

  CBitmap* pbmpOld ;

  BITMAP BmpSize ;

  Bitmap.GetBitmap(&BmpSize); file://get Image Size

  pbmpOld = dcMem.SelectObject(&Bitmap);

  dc.StretchBlt( 20, 20, 200, 200, &dcMem, 0, 0, BmpSize.bmWidth, BmpSize.bmHeight, SRCCOPY);

  dcMem.SelectObject( pbmpOld );

  }

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲精品一区二区| 亚洲区免费影片| 国产一区二区三区日韩欧美| 欧美激情国内偷拍| 情事1991在线| 日本亚洲欧美三级| 成人亲热视频网站| 成人网在线免费观看| 亚洲精品一区av在线播放| 久久夜精品香蕉| 日韩av免费在线播放| 中文字幕亚洲自拍| 精品国产拍在线观看| 2018中文字幕一区二区三区| 久久噜噜噜精品国产亚洲综合| 日本久久久久久久久| 欧美在线观看网址综合| 成人欧美在线视频| 日韩av在线播放资源| 日韩黄在线观看| 精品国产一区二区三区在线观看| 欧美电影第一页| 国产精品久久国产精品99gif| 人人爽久久涩噜噜噜网站| 日韩av在线播放资源| 久久99热精品| 欧美激情视频一区二区三区不卡| 欧美日韩亚洲一区二区三区| 不卡av电影院| 成人性生交xxxxx网站| 日韩免费精品视频| 日韩精品电影网| 欧美国产极速在线| 亚洲影院在线看| 亚洲午夜性刺激影院| 欧美亚洲国产视频小说| 日韩大片免费观看视频播放| 国产91免费观看| 91精品久久久久久久久| 日韩在线免费av| 欧美电影院免费观看| 精品国内自产拍在线观看| 国产精品99一区| 国产女人18毛片水18精品| 欧美精品免费在线| 日韩天堂在线视频| 久久久久一本一区二区青青蜜月| 欧美另类69精品久久久久9999| 国产亚洲精品激情久久| 色偷偷888欧美精品久久久| 成人午夜激情免费视频| 97国产精品视频人人做人人爱| 欧美高清视频在线播放| 欧美性生交大片免网| 一区二区三区天堂av| 久久艳片www.17c.com| 国产精品影片在线观看| 久久91精品国产91久久跳| 欧美xxxx18性欧美| 国产精品视频网站| 色七七影院综合| 日韩av电影手机在线| 亚洲日本成人网| 欧美乱大交xxxxx另类电影| 91久久久久久久| 狠狠久久五月精品中文字幕| 久热99视频在线观看| 日韩av免费在线观看| 亚洲人成亚洲人成在线观看| 欧美黑人极品猛少妇色xxxxx| 亚洲精品成a人在线观看| 国产亚洲美女久久| 日韩色av导航| 亚洲精品一区av在线播放| 欧美日韩一区二区三区在线免费观看| 国产日韩在线播放| 日韩电影大片中文字幕| 日韩欧美国产成人| 亚洲精品国精品久久99热| 欧美精品久久久久a| 欧美精品一区三区| 成人免费看片视频| 欧美wwwwww| 国产精品免费在线免费| 亚洲久久久久久久久久久| 欧美大片网站在线观看| 91亚洲精品视频| 色吧影院999| 欧美日韩国产影院| 亚洲色图欧美制服丝袜另类第一页| 欧美在线观看www| 91久久精品国产91久久| 欧美国产日韩一区二区| 欧美在线视频一区| 国产成人极品视频| 日本人成精品视频在线| 久国内精品在线| 国产激情久久久久| 精品国产一区久久久| 久久精品在线播放| 欧美一级高清免费| 欧美日韩精品在线| 最近中文字幕日韩精品| 97色在线视频| 韩国精品久久久999| 亚洲xxxxx电影| 久久久在线观看| 欧美精品www在线观看| 不卡av在线网站| 欧美在线免费视频| 亚洲精品国精品久久99热| 欧美日韩中文字幕| 1769国内精品视频在线播放| 欧美亚洲国产日韩2020| 中文字幕无线精品亚洲乱码一区| 亚洲午夜未满十八勿入免费观看全集| 国产女精品视频网站免费| 日韩欧美中文字幕在线播放| 日韩精品在线免费观看视频| 国产日本欧美一区二区三区在线| 欧美精品精品精品精品免费| 欧美电影免费观看高清完整| 国产一区玩具在线观看| 亚洲aa在线观看| 欧美美女操人视频| 黄色一区二区在线| 最近2019年好看中文字幕视频| 欧美一区亚洲一区| 亚洲一区二区国产| 日韩精品在线观看视频| 国产精品久久久久久超碰| 国产亚洲精品一区二555| 久久精品91久久香蕉加勒比| 亚洲高清不卡av| 97久久精品人搡人人玩| 中文字幕免费精品一区| 中文字幕综合一区| 不卡伊人av在线播放| 91精品综合久久久久久五月天| 久久久成人精品| 亚洲国产成人一区| 中文字幕久热精品视频在线| 中文字幕亚洲专区| 国产v综合ⅴ日韩v欧美大片| 精品国产精品自拍| 精品国模在线视频| 亚洲精品av在线| 亚洲乱码av中文一区二区| 91亚洲精品久久久| 亚洲精品久久久久中文字幕欢迎你| 欧美电影在线观看完整版| 欧美午夜女人视频在线| 国产精品爽爽ⅴa在线观看| 国产精品视频色| 亚洲男人的天堂在线| 国产精品日韩在线观看| 欧美日韩另类字幕中文| 精品国产一区二区三区久久狼黑人| 亚洲精品欧美日韩专区| 91精品在线国产| 亚洲综合大片69999| 2019国产精品自在线拍国产不卡| 日韩精品久久久久久福利| 夜夜嗨av色综合久久久综合网|