六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

Visual C++中完成對(duì)圖像數(shù)據(jù)的讀取顯示

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

  為了簡化問題,該數(shù)據(jù)庫的表中只有一個(gè)名為Images的OLE字段,我使用DAO連接操作數(shù)據(jù)庫,讀取的圖像數(shù)據(jù)顯示在一個(gè)對(duì)話框上,至于使用ODBC、DAO還是ADO,這要根據(jù)具體情況而定,但無論使用哪一種,對(duì)圖像的顯示來說,實(shí)現(xiàn)的過程是大同小異的。由于篇幅有限,文章中對(duì)如何實(shí)現(xiàn)數(shù)據(jù)庫的連接不再作具體的說明,有興趣的讀者朋友可以參考VC數(shù)據(jù)庫編程的資料。實(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ù)庫的表中僅有一個(gè)字段
file://}}AFX_FIELD_INIT
m_nDefaultType = dbOpenDynaset;//以動(dòng)態(tài)集方式打開數(shù)據(jù)庫
}
CString CimageData::GetDefaultDBName()
{
return _T("E:\\IMAGES.mdb");//默認(rèn)的ACESS數(shù)據(jù)庫在E盤,名為IMAGES
}

CString CimageData::GetDefaultSQL()
{
return _T("[Table]");//默認(rèn)打開數(shù)據(jù)庫中名為"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ù)庫中的圖像字段交換數(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ù)庫
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ù)庫為ACESS97,程序在windows98、Visual C++6.0環(huán)境下編譯通過,運(yùn)行正常。


主站蜘蛛池模板: 日韩爱爱 | 亚洲国产精品高清在线一区 | 亚洲专区区免费 | 天堂中文网 | 午夜欧美精品久久久久久久久 | 日日操日日干 | 午夜片在线观看 | 视频一区在线 | 日日摸日日操 | 亚洲不卡在线播放 | 青青草原国产 | 亚洲a级黄色 | 亚洲第一成人影院 | 天天躁日日躁 疯人影院 | 在线观看 a国v | 午夜国产精品久久久久 | 五月花精品视频在线观看 | 日韩我不卡 | 日韩三级在线观看视频 | 在线观看91精品国产剧情免费 | 午夜高清视频在线观看 | 日本视频在线免费播放 | 婷婷在线视频 | 日韩深夜福利视频 | 亚洲高清日韩精品第一区 | 日韩在线第三页 | 亚洲视色| 亚洲第一页综合 | 青青操在线视频 | 一级@片 | 天天舔天天射天天干 | 日韩三级视频在线 | 日韩一区二区视频在线观看 | 探花网站 | 五月激情啪啪网 | 综合久久久久久 | 手机看片福利在线 | 在线免费看污视频 | 四虎在线永久免费视频网站 | 亚洲综合久 | 亚洲色大成网站www 亚洲三级中文字幕 |