999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

IPicture控件實(shí)現(xiàn)圖片數(shù)據(jù)在數(shù)據(jù)庫中的存取

2015-04-17 22:39:24凡揚(yáng)華
機(jī)械工程與自動(dòng)化 2015年6期
關(guān)鍵詞:數(shù)據(jù)庫

凡揚(yáng)華

(同濟(jì)大學(xué) 軟件學(xué)院,上海 201900)

IPicture控件實(shí)現(xiàn)圖片數(shù)據(jù)在數(shù)據(jù)庫中的存取

凡揚(yáng)華

(同濟(jì)大學(xué) 軟件學(xué)院,上海 201900)

針對(duì)數(shù)據(jù)庫應(yīng)用程序開發(fā)中以往圖片類型數(shù)據(jù)存取方法存在一致性、安全性及完整性較差的缺點(diǎn),利用數(shù)據(jù)庫管理系統(tǒng)提供的一種名為二進(jìn)制大對(duì)象(BLOB)的字段類型,提出了一種利用IPicture控件實(shí)現(xiàn)圖片數(shù)據(jù)在數(shù)據(jù)庫大對(duì)象字段中的存取方法。

數(shù)據(jù)庫訪問技術(shù);IPicture控件;圖片數(shù)據(jù)

0 引言

為了便于建模,一般的數(shù)據(jù)庫管理系統(tǒng)都提供了字符型字段、數(shù)值型字段等常見數(shù)據(jù)類型,有的數(shù)據(jù)庫管理系統(tǒng),比如DB2,也提供了用于保存復(fù)雜結(jié)構(gòu)的數(shù)據(jù)類型,如圖片、文檔等,將對(duì)象保存為長(zhǎng)二進(jìn)制數(shù)據(jù)類型。但對(duì)于二進(jìn)制數(shù)據(jù)類型,不能采用像一般數(shù)據(jù)類型那樣的賦值操作,因而存取起來比較復(fù)雜。一種普遍采用的變通方法是將本地圖像(文檔)文件的路徑作為字符串保存在數(shù)據(jù)庫字段中,然后根據(jù)字符串,索引數(shù)據(jù)庫外的圖像(文檔)文件完成訪問功能。但該方法有一個(gè)非常明顯的缺點(diǎn),即大對(duì)象文件并不是保存在數(shù)據(jù)庫字段中,數(shù)據(jù)庫管理系統(tǒng)提供的有關(guān)數(shù)據(jù)的安全性、完整性及一致性等良好特性未能得到有效實(shí)施。本文利用IPicture控件,從分析其核心功能入手,結(jié)合內(nèi)存數(shù)據(jù)交換技術(shù),介紹了一種將圖像文件直接存入數(shù)據(jù)庫字段的技術(shù)。

1 控件IPicture的功能

IPicture控件采用微軟COM接口技術(shù),封裝了常見格式(如*.jpg,*.bmp,*.png等)的圖片操作,下面對(duì)相關(guān)的主要函數(shù)接口進(jìn)行介紹。

1.1 從文件中載入圖片

從文件中載入圖片使用的OleLoadPicture函數(shù)如下:

OleLoadPicture(pStm,dwSize,FALSE,IID_IPicture,(LPVOID*)&m_pPic)

其中:pStm為IStream*類型的COM接口指針,需事先在內(nèi)存中創(chuàng)建,并裝載了來自圖片文件的數(shù)據(jù)流;dwSize為指明載入圖片數(shù)據(jù)的字節(jié)數(shù),即圖片文件的大??;FALSE為布爾值,這里傳入FALSE很關(guān)鍵,否則對(duì)流的操作將失效;IID_IPicture為接口標(biāo)識(shí)符;m_pPic為IPicture*類型的COM接口指針,即載入圖片的存放處。

其關(guān)鍵技術(shù)是在內(nèi)存中建立圖片數(shù)據(jù)流,其實(shí)現(xiàn)的關(guān)鍵代碼如下:

//省略錯(cuò)誤處理部分

CFile file;

file.Open(strFileName,CFile::modeRead);

DWORD dwSize=file.GetLength();

//在內(nèi)存中分配堆空間

HGLOBAL hMem=GlobalAlloc(GMEM_MOVEABLE, dwSize);

LPVOID pDes = ::GlobalLock(hMem);

//通過文件讀操作將圖片內(nèi)容載入堆空間:

file.Read(pDes,dwSize);

//在堆空間上建立圖片數(shù)據(jù)流pStm:

IStream *pStm=NULL;

CreateStreamOnHGlobal(hMem,TRUE,&pStm);

通過以上代碼,IPicture*類型的控件變量m_pPic即在內(nèi)存中保存了圖片數(shù)據(jù)流,并且該數(shù)據(jù)流可以用于后續(xù)的存入數(shù)據(jù)庫操作。

1.2 顯示圖片

裝載了圖片數(shù)據(jù)的IPicture控件,主要功能之一是用于圖片顯示,其用到成員函數(shù)Render()。該功能比較容易實(shí)現(xiàn),本文不詳述。

2 將BLOB字段值載入IPicture控件

在Visual C++ 6.0開發(fā)環(huán)境下,數(shù)據(jù)庫的訪問比較常用的方法是采用微軟的MFC ODBC技術(shù)。MFC ODBC封裝了CDatabase和CRecordset類,用于建立數(shù)據(jù)庫連接和從數(shù)據(jù)庫中獲取查詢數(shù)據(jù)集或更新數(shù)據(jù)庫。其中,可以在CRecordset類型的對(duì)象中傳入SQL查詢語句,并通過列綁定和列交換就可以將數(shù)據(jù)庫字段值交換為CRecordset對(duì)象成員變量值,這里不詳述。

雖然數(shù)據(jù)庫中的BLOB類型字段可以通過列交換技術(shù)保存在CRecordset對(duì)象的成員變量中,但CLongBinary類型的成員變量并不能用于直接存取。因此,利用IPicture控件和內(nèi)存數(shù)據(jù)交換技術(shù)可以實(shí)現(xiàn)對(duì)此二進(jìn)制數(shù)據(jù)流的存取技術(shù)。首先將CLongBinary類型的二進(jìn)制流數(shù)據(jù)拷貝給內(nèi)存堆空間,然后在內(nèi)存堆空間上建立IStream*類型的數(shù)據(jù)流,最后用OleLoadPicture(...)函數(shù)將數(shù)據(jù)流載入IPicture控件。其實(shí)現(xiàn)的關(guān)鍵代碼如下:

//將二進(jìn)制數(shù)據(jù)拷貝給內(nèi)存堆空間:

//lob是CLongBinary類型的變量,對(duì)應(yīng)圖像字段

//一般通過CRecordset類的列交換技術(shù)獲得。

LPSTR pBuff=(LPSTR)GlobalLock(lob.m_hData);

HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,

Lob.m_dwDataLength);

void* pData=GlobalLock(hGlobal);

memcpy(pData,pBuff,lob.m_dwDataLength);

GlobalUnlock(hGlobal);

//在內(nèi)存空間上建立IStream流

IStream *pStream=NULL;

CreateStreamOnHGlobal(hGlobal,TRUE,&pStream);

//讀入數(shù)據(jù)流到IPicture控件

OleLoadPicture(pStream,nSize,FALSE,IID_IPicture,(LPVOID*)&m_pPic)

通過以上代碼,實(shí)現(xiàn)了將數(shù)據(jù)庫中圖片數(shù)據(jù)讀取到IPicture控件中的功能。該IPicture控件對(duì)象可用于顯示圖片內(nèi)容或?qū)D片內(nèi)容存入文件或數(shù)據(jù)庫。

3 將IPicture控件內(nèi)容寫入數(shù)據(jù)庫

將IPicture控件中的圖片數(shù)據(jù)存入數(shù)據(jù)庫字段中是第2節(jié)中所述的反向操作。這里,關(guān)鍵是如何獲得IPicture組件中的數(shù)據(jù)流,本文通過對(duì)IPicture接口的研究,開發(fā)了實(shí)現(xiàn)技術(shù),其主要代碼如下:

//申請(qǐng)內(nèi)存空間,并創(chuàng)建IStream流,與內(nèi)存綁定

IStream* pSrcStream=NULL;

//m_dwImgSize變量:從文件中讀入圖像時(shí)保存的圖像大小

HGLOBAL hMemSrc=::GlobalAlloc(GPTR,m_dwImgSize);

BYTE *pMem=0;

if(hMemSrc!=NULL)

{

pMem=(BYTE*)GlobalLock(hMemSrc);

if(pMem!=NULL)

{

//在申請(qǐng)的內(nèi)存空間上綁定IStream型變量

hr=::CreateStreamOnHGlobal(hMemSrc,TRUE,&pSrcStream);

GlobalUnlock(hMemSrc);

}

else//出錯(cuò)處理

{

GlobalFree(hMemSrc);

hr=E_OUTOFMEMORY;

}

}

else

{

hr=E_OUTOFMEMORY;

}

if(NULL==pSrcStream)

return hr;

//通過pSrcStream將IPicture圖像數(shù)據(jù)存入內(nèi)存區(qū)塊pMem;

LONG cbSize=0;

//SaveAsFile函數(shù)起了關(guān)鍵作用。

hr=m_pPic->SaveAsFile(pSrcStream,FALSE,&cbSize);

if(FAILED(hr))

{

pSrcStream->Release();

pSrcStream=NULL;

return hr;

}

else

{

//將pSrcStream指針置于數(shù)據(jù)起始位置,以便后續(xù)寫入字段操作。

hr=pSrcStream->Commit(STGC_DEFAULT);

LARGE_INTEGER dlibMove;

ULARGE_INTEGER dlibNew;

memset(&dlibMove,0,sizeof(dlibMove));

hr=pSrcStream->Seek(dlibMove,STREAM_SEEK_SET,&dlibNew);

}

//利用源流pSrcStream寫入目標(biāo)流(字段)

if(pMem)

{

//lob是CLongBinary類型的變量,對(duì)應(yīng)圖像字段

lob.m_dwDataLength=m_dwImgSize;

HGLOBAL hGlobal=GlobalAlloc(GPTR,m_dwImgSize);//申請(qǐng)存放圖像數(shù)據(jù)的空間。

lob.m_hData = GlobalLock(hGlobal);//將該空間賦給m_hData成員;

//向圖像字段寫入IPicture數(shù)據(jù)

memcpy(lob.m_hData,pMem,m_dwImgSize);

GlobalUnlock(hGlobal);

pSrcStream->Release();

pSrcStream=NULL;

}

上述代碼關(guān)鍵點(diǎn)為IPicture控件成員函數(shù)SaveAsFile的應(yīng)用,并注意第二參數(shù)應(yīng)設(shè)置為FALSE,它實(shí)現(xiàn)了提取控件中的圖像數(shù)據(jù)流并存入內(nèi)存區(qū)塊的目的。其他代碼都是圍繞此圖像數(shù)據(jù)區(qū)塊的數(shù)據(jù)交換操作,以實(shí)現(xiàn)將圖像數(shù)據(jù)存入數(shù)據(jù)庫字段的功能。4 封裝一個(gè)通用類CPictureField

利用 C++語言面向?qū)ο蟮牧己锰匦?,設(shè)計(jì)出針對(duì)數(shù)據(jù)庫圖像字段的通用類CPictureField。該類封裝了上述介紹的主要功能,類型聲明主要如下:

class CPictureField{

public:

//將IPicture圖像數(shù)據(jù)存入數(shù)據(jù)庫字段,

//通過CRecordset接口可以獲取目標(biāo)字段

//通常是二進(jìn)制數(shù)據(jù)流類型CLongBinary

HRESULT DumpToField(CRecordset& set);

//將IPicture圖像數(shù)據(jù)存入文件

HRESULT DumpToFile(LPCTSTR szFileName);

//將數(shù)據(jù)庫圖像數(shù)據(jù)載入IPicture控件

bool LoadFromField(CRecordset& set);

//將圖像文件內(nèi)容載入IPicture控件//同時(shí),該函數(shù)保存了圖像大小m_dwImgSize

bool LoadFromFile(LPCTSTR strFileName);

……

protected:

DWORD m_dwImgSize;

……

//核心部件:IPicture控件指針

IPicture* m_pPic;

};

CPictureField類實(shí)現(xiàn)的主要功能有:①從硬盤圖像文件中載入圖像數(shù)據(jù);②將圖像數(shù)據(jù)寫入數(shù)據(jù)庫字段;③將圖像數(shù)據(jù)寫入硬盤文件;④從數(shù)據(jù)庫字段中載入圖像數(shù)據(jù)。

5 結(jié)論

本文介紹了在C++編程語言環(huán)境下(基于Visual C++ 6.0版本),利用IPicture控件,結(jié)合內(nèi)存數(shù)據(jù)交換技術(shù),進(jìn)行數(shù)據(jù)庫圖像字段的直接存取,解決了常規(guī)方法的數(shù)據(jù)一致性、安全性及完整性方面的問題。通過項(xiàng)目的實(shí)際應(yīng)用,驗(yàn)證了該技術(shù)思路的可行性。同時(shí),本文給出了實(shí)現(xiàn)此類功能的核心代碼,讀者可以根據(jù)自己項(xiàng)目開發(fā)的實(shí)際需要,稍加修改及整合,即可應(yīng)用到具體的項(xiàng)目實(shí)踐中。

[1] 李閩溟,吳繼剛.Visual C++ 6.0數(shù)據(jù)庫系統(tǒng)開發(fā)實(shí)例導(dǎo)航[M].北京:人民郵電出版社,2002.

Access Image Data in A Database by Using IPicture Control

FAN Yang-hua

(School of Software Engineering, Tongji University, Shanghai 201900, China)

To the problem of poor consistency, security and integrity in the storage of image data in the development of database application program, an access method of the image data by using IPicture control in large database is proposed, which is based on binary large object (BLOB) field types provided by database management systems.

technology of database access; IPicture control; image data

1672- 6413(2015)06- 0036- 02

2015- 01- 04;

2015- 09- 27

凡揚(yáng)華(1976-),男,湖南郴州人,工程師,本科, 現(xiàn)從事鋼鐵產(chǎn)品工藝設(shè)計(jì)管理工作 。

TP274

A

猜你喜歡
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
兩種新的非確定數(shù)據(jù)庫上的Top-K查詢
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
主站蜘蛛池模板: 国产国模一区二区三区四区| 91免费观看视频| 国产精品男人的天堂| 日韩精品高清自在线| 中文字幕1区2区| 亚洲精品亚洲人成在线| 欧美a在线| 91久久精品日日躁夜夜躁欧美| 国产精选小视频在线观看| 第一页亚洲| 美女免费黄网站| 在线观看免费黄色网址| 午夜久久影院| 91精品综合| 亚洲国产AV无码综合原创| 一级做a爰片久久免费| 日韩精品中文字幕一区三区| 日本免费新一区视频| 毛片基地视频| 日韩中文无码av超清| 有专无码视频| 国产波多野结衣中文在线播放| a级毛片毛片免费观看久潮| 欧美在线观看不卡| 亚洲a级在线观看| 国产人人干| 欧美色伊人| 伊人AV天堂| 色爽网免费视频| 久久人搡人人玩人妻精品| 国产人免费人成免费视频| 国产在线拍偷自揄拍精品| 在线视频97| 福利国产微拍广场一区视频在线| 国产交换配偶在线视频| 无码一区二区三区视频在线播放| 亚洲国产一区在线观看| 人人澡人人爽欧美一区| 99久久精品国产精品亚洲| 国产亚洲欧美在线视频| 亚洲国产成人无码AV在线影院L| 国产Av无码精品色午夜| 麻豆国产在线观看一区二区 | 中国一级毛片免费观看| 黄色网在线| 无套av在线| 国产免费高清无需播放器| 一本一本大道香蕉久在线播放| 四虎成人精品| 99re在线免费视频| 国产精品尹人在线观看| 国产91精品久久| 国产屁屁影院| 亚洲va精品中文字幕| 亚洲香蕉伊综合在人在线| 无码粉嫩虎白一线天在线观看| 二级特黄绝大片免费视频大片| 国产黄网站在线观看| 国产精品成人第一区| 免费日韩在线视频| 免费不卡视频| 国产无遮挡猛进猛出免费软件| 婷婷六月天激情| 国产精品欧美在线观看| 91精品国产情侣高潮露脸| 久久综合色88| 精品国产亚洲人成在线| 女人18毛片久久| 久久综合一个色综合网| 免费一看一级毛片| 国产探花在线视频| 91丝袜美腿高跟国产极品老师| 久久永久视频| 欧美啪啪一区| 呦女精品网站| 在线国产欧美| 久久婷婷综合色一区二区| 看你懂的巨臀中文字幕一区二区| 91久久偷偷做嫩草影院电| 国产一级做美女做受视频| 2021精品国产自在现线看| 精品伊人久久久香线蕉 |