資源描述:
《在VC++中實(shí)現(xiàn)設(shè)備無關(guān)位圖類》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、在VC++中實(shí)現(xiàn)設(shè)備無關(guān)位圖類CDib?摘要:本文通過CDib類庫的實(shí)現(xiàn),介紹在微軟VisualC++6.0版集成開發(fā)環(huán)境下,備無關(guān)位圖程序的實(shí)現(xiàn)機(jī)制和編程要點(diǎn),并給出關(guān)鍵部分的程序代碼。關(guān)鍵詞:VisualC++應(yīng)用程序DIBDDBBMP文件一、問題的提出眾所周知,Windows可以進(jìn)行各種各樣的圖像處理,這歸功于它全面的位圖支持能力。早在DOS時(shí)代就存在著許多的圖像文件格式,較著名的如PCX、GIF、JPEG、TGA等,在Windows中,Microsoft又制定了一個(gè)BMP格式。Window
2、s把位圖(bitmap)分成兩大類:“設(shè)備相關(guān)位圖”(DeviceDependentBitmap,簡(jiǎn)稱DDB)與“設(shè)備獨(dú)立位圖”(DeviceIndependentBitmap,簡(jiǎn)稱DIB)。嚴(yán)格的說,DIB是一種“格式”,它可以存放在內(nèi)存中,也可以存儲(chǔ)成文件,即常見的BMP文件,不過有時(shí)候它的擴(kuò)展名可能是DIB。大體而言,DIB格式由三部分組成,即:圖片信息、調(diào)色板信息、像素陣列?!皥D片信息”中記錄著圖像文件的大小、色彩數(shù)(可分為單色、16色、256色和真彩四種),以及僅有參考價(jià)值的“分辨率”等
3、信息?!罢{(diào)色板信息”指的是這張圖像所需參考的調(diào)色板,雖然“調(diào)色板信息”很重要,但是“真彩”的DIB圖像卻沒有調(diào)色板。“像素陣列”則是實(shí)際存放圖像的部分,它是一個(gè)很大的數(shù)組,對(duì)應(yīng)于屏幕上的像素。VC++的MFC中,以CBitmap類代表DDB圖像,極大的方便了編程人員對(duì)DDB的使用。然而通常情況下,沒有人會(huì)把DDB圖像存儲(chǔ)成文件,因此我們使用更多的是DIB,遺憾的是MFC不象Borland的OWL,有TDib類可以用來處理DIB文件,它對(duì)于DIB的支持幾乎可以說是沒有,因此有必要設(shè)計(jì)可以重復(fù)使用的類
4、CDib,專門用來處理DIB。二、CDib的具體實(shí)現(xiàn)在一個(gè)涉及DIB操作的應(yīng)用程序中,常用到的數(shù)據(jù)結(jié)構(gòu)有BITMAPFILEHEADER、BITMAPINFO、BITMAPINFOHEAD、RGBQUAD。簡(jiǎn)單的說就是:BMP文件=BITMAPFILEHEADER+BITMAPINFO+位圖數(shù)據(jù)=BITMAPFILEHEADER+BITMAPINFOHEAD+RGBQUAD+位圖數(shù)據(jù)而存在內(nèi)存中的DIB對(duì)象為:DIB對(duì)象=BITMAPINFO+位圖數(shù)據(jù)=BITMAPINFOHEAD+RGBQUAD
5、+位圖數(shù)據(jù)1.Dib類的頭文件定義在所實(shí)現(xiàn)的CDib類中,將完成與DIB操作有關(guān)的大部分功能,例如把DDB轉(zhuǎn)換成DIB、從BMP文件建立DIB、建立空白DIB、拷貝調(diào)色板、讀取BMP文件、存儲(chǔ)BMP文件、繪制圖像等等。在自定義的類的頭文件中所需加入的函數(shù)與變量具體如下:classCDib:publicCObject{public:CDib(CBitmap&ddb,CPalette*palette);CDib(char*bmpfile);CDib(CFile&file);CDib(intWidth,
6、intHeight,intBitsPerPixel);~CDib();//取得DIB相關(guān)信息//返回像素陣列void*GetBits();//返回每像素的位數(shù)intGetBitsPerPixel();//返回圖像尺寸BOOLGetDimension(CSize&size);DWORDWidth();DWORDHeight();//調(diào)色板大小intGetPaletteCount();//每條掃描線所需的字節(jié)數(shù)DWORDBytesPerLine();//取得調(diào)色板CPalette*GetPalette
7、();//繪圖函數(shù)//在DC上縮放輸出intStretchToDC(CDC&dc,CRect&src,CRect&dst,DWORDrop=SRCCOPY);//在DC上等尺寸輸出intSetToDC(CDC&dc,CRect&src,CPoint&dst);//輸出到DDBBOOLCopyToDDB(CBitmap&ddb);//文件相關(guān)//存文件BOOLDoSaveFile(char*bmpfile);//寫入指定文件BOOLDoWriteFile(CFile&file);//讀入指定文件BO
8、OLDoReadFile(CFile&file);Protected://計(jì)算像素陣列的大小longGetImageBodySize();//計(jì)算BITMAPINFOHEADER和RGBQUAD數(shù)組的大小intGetBITMAPINFOSize();//初始化文件頭的信息voidInitDibInfo(intBitsPerPixel,intw=0,inth=0);//復(fù)制調(diào)色板voidCopyPalette(CPalette&palette);//文件頭BITMAPINFO*Dib