真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

VisualC++中如何實(shí)現(xiàn)對(duì)圖像數(shù)據(jù)的讀取顯示

本篇文章為大家展示了Visual C++中如何實(shí)現(xiàn)對(duì)圖像數(shù)據(jù)的讀取顯示,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的融安網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

在利用VC進(jìn)行數(shù)據(jù)庫(kù)編程時(shí),經(jīng)常需要處理數(shù)據(jù)庫(kù)中的圖像數(shù)據(jù),將該圖像從數(shù)據(jù)庫(kù)中讀取出來并顯示,圖像數(shù)據(jù)與文本字段不同,它是作為OLE字段在數(shù)據(jù)庫(kù)中存儲(chǔ),通過數(shù)據(jù)集對(duì)象的成員變量自動(dòng)交換得到的圖像數(shù)據(jù),得到的數(shù)據(jù)并不能直接顯示,如何處理圖像數(shù)據(jù),一直是數(shù)據(jù)庫(kù)編程中的一個(gè)難點(diǎn)。

目前關(guān)于VC進(jìn)行數(shù)據(jù)庫(kù)編程的資料不少,但很少涉及圖像數(shù)據(jù)的操作,筆者針對(duì)一現(xiàn)狀,結(jié)合自己開發(fā)的一個(gè)項(xiàng)目,解決了如何顯示數(shù)據(jù)庫(kù)中的圖像這一問題,以操作ACESS數(shù)據(jù)庫(kù)為例子,講解一下自己的實(shí)現(xiàn)思路。

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

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

class CimageData : public CDaoRecordset  {  public:  CimageData (CDaoDatabase* pDatabase = NULL);  DECLARE_DYNAMIC(CimageData)  file://{{AFX_FIELD(CimageData, CDaoRecordset)  CByteArray m_Images;//聲明字節(jié)數(shù)組用來存放圖像數(shù)據(jù)  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

該類的實(shí)現(xiàn)為:

CimageData:: CimageData (CDaoDatabase* pdb)  : CDaoRecordset(pdb)  {  file://{{AFX_FIELD_INIT(CimageData)  m_nFields = 1;//數(shù)據(jù)庫(kù)的表中僅有一個(gè)字段  file://}}AFX_FIELD_INIT  m_nDefaultType = dbOpenDynaset;//以動(dòng)態(tài)集方式打開數(shù)據(jù)庫(kù)  }  CString CimageData::GetDefaultDBName()  {  return _T("E:\\IMAGES.mdb");//默認(rèn)的ACESS數(shù)據(jù)庫(kù)在E盤,名為IMAGES  }  CString CimageData::GetDefaultSQL()  {  return _T("[Table]");//默認(rèn)打開數(shù)據(jù)庫(kù)中名為"Table"的表  }  void CimageData::DoFieldExchange(CDaoFieldExchange* pFX)  {  file://{{AFX_FIELD_MAP(CimageData)  pFX->SetFieldType(CDaoFieldExchange::outputColumn);  DFX_Binary(pFX, _T("[Images]"), m_Images);//以二進(jìn)制方式在Images字段和m_Images變量間交換數(shù)據(jù)  file://}}AFX_FIELD_MAP  }

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

BOOL CImageDlg:: GetImageData(CByteArray & DBArray)  {  CByteArray Array;  Array.Copy( DBArray);  int HeaderLen = 78 + sizeof(BITMAPFILEHEADER); file://確定圖像頭信息的起始位置  Array.RemoveAt( 0, HeaderLen ); // 移動(dòng)到圖像頭信息的起始位置  BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData() ;  BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ;  file://得到圖像數(shù)據(jù)的頭信息  int nColors=bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 《 bmiHeader.biBitCount;  file://確定圖像的顏色數(shù)  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://得到圖像各個(gè)像素的具體數(shù)據(jù)  CClientDC dc(NULL);  HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,  &bmiHeader,  CBM_INIT,  lpDIBBits,  &bmInfo,  DIB_RGB_COLORS);  file://生成位圖句柄  Bitmap.Attach( hBmp );//將該句柄與定義的Bitmap對(duì)象聯(lián)系在一起  Array.RemoveAll(); file://釋放內(nèi)存  return TRUE;  }

有了上面的準(zhǔn)備工作,現(xiàn)在可以實(shí)現(xiàn)圖像的顯示函數(shù)了,其實(shí)現(xiàn)如下:

void CImageDlg::OnShowImage()  {  CimageData db;//定義記錄集對(duì)象  db.Open();打開數(shù)據(jù)庫(kù)  GetImageData(db.m_Images);//根據(jù)記錄集對(duì)象的成員變量生成圖像對(duì)象  file://以下是在對(duì)話框的固定區(qū)域顯示圖像  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 );  }

以上代碼中使用的數(shù)據(jù)庫(kù)為ACESS97,程序在windows98、Visual C++6.0環(huán)境下編譯通過,運(yùn)行正常。

上述內(nèi)容就是Visual C++中如何實(shí)現(xiàn)對(duì)圖像數(shù)據(jù)的讀取顯示,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


文章題目:VisualC++中如何實(shí)現(xiàn)對(duì)圖像數(shù)據(jù)的讀取顯示
文章出自:http://weahome.cn/article/pdcjes.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部