BMP圖像的讀寫(xiě)(8位和24位)_第1頁(yè)
BMP圖像的讀寫(xiě)(8位和24位)_第2頁(yè)
BMP圖像的讀寫(xiě)(8位和24位)_第3頁(yè)
BMP圖像的讀寫(xiě)(8位和24位)_第4頁(yè)
BMP圖像的讀寫(xiě)(8位和24位)_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、南通大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院數(shù)字圖像處理課程實(shí)驗(yàn)報(bào) 告 書(shū)實(shí) 驗(yàn) 名 BMP文件的讀寫(xiě)(8位和24位) 班 級(jí) 計(jì) 121 姓 名 張 進(jìn) 學(xué) 號(hào) 1213022016 2014年6月 16 日1、 實(shí)驗(yàn)內(nèi)容1、了解BMP文件的結(jié)構(gòu)2、8位位圖和24位位圖的讀取2、 BMP圖形文件簡(jiǎn)介 BMP(Bitmap-File)圖形文件是Windows采用的圖形文件格式,在Windows環(huán)境下運(yùn)行的所有圖象處理軟件都支持BMP圖象文件格式。Windows系統(tǒng)內(nèi)部各圖像繪制操作都是以BMP為基礎(chǔ)的。Windows 3.0以前的BMP圖文件格式與顯示設(shè)備有關(guān),因此把這種BMP圖象文件格式稱為設(shè)備相關(guān)位圖DD

2、B(device-dependent bitmap)文件格式。Windows 3.0以后的BMP圖象文件與顯示設(shè)備無(wú)關(guān),因此把這種BMP圖象文件格式稱為設(shè)備無(wú)關(guān)位圖DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系統(tǒng)中仍然存在DDB位圖,象BitBlt()這種函數(shù)就是基于DDB位圖的,只不過(guò)如果你想將圖像以BMP格式保存到磁盤(pán)文件中時(shí),微軟極力推薦你以DIB格式保存),目的是為了讓W(xué)indows能夠在任何類型的顯示設(shè)備上顯示所存儲(chǔ)的圖象。BMP位圖文件默認(rèn)的文件擴(kuò)展名是BMP或者bmp(有時(shí)它也會(huì)以.DIB或.RLE作擴(kuò)展名)。 位圖文件可看

3、成由4個(gè)部分組成:位圖文件頭(bitmap-file header)、位圖信息頭(bitmap-information header)、彩色表(color table)和定義位圖的字節(jié)陣列,它具有如下所示的形式。 位圖文件的組成 結(jié)構(gòu)名稱 符號(hào) 位圖文件頭(bitmap-file header)BITMAPFILEHEADERbmfh位圖信息頭(bitmap-information header)BITMAPINFOHEADERbmih彩色表(color table)RGBQUADaColors

4、圖象數(shù)據(jù)陣列字節(jié)BYTEaBitmapBits 位圖文件結(jié)構(gòu)內(nèi)容摘要 偏移量 域的名稱 大小 內(nèi)容    圖象文件 頭0000h文件標(biāo)識(shí)2 bytes兩字節(jié)的內(nèi)容用來(lái)識(shí)別位圖的類型: BM : Windows 3.1x, 95, NT,  BA :OS/2 Bitmap Array CI :OS/2 Color Icon CP :OS/2

5、 Color Pointer IC : OS/2 Icon PT :OS/2 Pointer注:因?yàn)镺S/2系統(tǒng)并沒(méi)有被普及開(kāi),所以在編程時(shí),你只需判斷第一個(gè)標(biāo)識(shí)“BM”就行。0002hFile Size1 dword用字節(jié)表示的整個(gè)文件的大小0006hReserved1 dword保留,必須設(shè)置為0000AhBitmap Data Offset1 dword從文件開(kāi)始到位圖數(shù)據(jù)開(kāi)始之間的數(shù)據(jù)(bitmap data)之間的偏移量000

6、EhBitmap Header Size1 dword位圖信息頭(Bitmap Info Header)的長(zhǎng)度,用來(lái)描述位圖的顏色、壓縮方法等。下面的長(zhǎng)度表示: 28h - Windows 3.1x, 95, NT,  0Ch - OS/2 1.x F0h - OS/2 2.x注:在Windows95、98、2000等操作系統(tǒng)中,位圖信息頭的長(zhǎng)度并不一定是28h,因?yàn)槲④浺呀?jīng)制定出了新的BMP文件

7、格式,其中的信息頭結(jié)構(gòu)變化比較大,長(zhǎng)度加長(zhǎng)。所以最好不要直接使用常數(shù)28h,而是應(yīng)該從具體的文件中讀取這個(gè)值。這樣才能確保程序的兼容性。0012hWidth1 dword位圖的寬度,以象素為單位0016hHeight1 dword位圖的高度,以象素為單位001AhPlanes1 word位圖的位面數(shù)(注:該值將總是1)圖象 信息 頭  001ChBits Per Pixel1 word每個(gè)象素的位數(shù) 1 - 單色位圖(實(shí)際上可有兩種顏色,缺省情況下是黑色和白色。你可

8、以自己定義這兩種顏色) 4 - 16 色位圖 8 - 256 色位圖 16 - 16bit 高彩色位圖 24 - 24bit 真彩色位圖 32 - 32bit 增強(qiáng)型真彩色位圖001EhCompression1 dword壓縮說(shuō)明: 0 - 不壓縮 (使用BI_RGB表示) 1 - RLE 8-使用8位RLE

9、壓縮方式(用BI_RLE8表示) 2 - RLE 4-使用4位RLE壓縮方式(用BI_RLE4表示) 3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)0022hBitmap Data Size1 dword用字節(jié)數(shù)表示的位圖數(shù)據(jù)的大小。該數(shù)必須是4的倍數(shù)0026hHResolution1 dword用象素/米表示的水平分辨率002AhVResolution1 dword用象素/米表示的垂直分辨率002EhColors1 dword位圖使用的

10、顏色數(shù)。如8-比特/象素表示為100h或者 256.0032hImportant Colors1 dword指定重要的顏色數(shù)。當(dāng)該域的值等于顏色數(shù)時(shí)(或者等于0時(shí)),表示所有顏色都一樣重要調(diào)色板數(shù)據(jù)根據(jù)BMP版本的不同而不同PaletteN * 4 byte調(diào)色板規(guī)范。對(duì)于調(diào)色板中的每個(gè)表項(xiàng),這4個(gè)字節(jié)用下述方法來(lái)描述RGB的值: 1字節(jié)用于藍(lán)色分量1字節(jié)用于綠色分量1字節(jié)用于紅色分量1字節(jié)用于填充符(設(shè)置為0)圖象數(shù)據(jù)根據(jù)BMP版本及調(diào)色板尺寸的不同而不同Bitmap Dataxxx bytes該域的大

11、小取決于壓縮方法及圖像的尺寸和圖像的位深度,它包含所有的位圖數(shù)據(jù)字節(jié),這些數(shù)據(jù)可能是彩色調(diào)色板的索引號(hào),也可能是實(shí)際的RGB值,這將根據(jù)圖像信息頭中的位深度值來(lái)決定。3、 讀寫(xiě)涉及的原理1、 圖像的二值化的基本原理 圖像的二值化處理就是講圖像上的點(diǎn)的灰度置為0或255,也就是講整個(gè)圖像呈現(xiàn)出明顯的黑白效果。即將256個(gè)亮度等級(jí)的灰度圖像通過(guò)適當(dāng)?shù)拈y值選取而獲得仍然可以反映圖像整體和局部特征的二值化圖像。在數(shù)字圖像處理中,二值圖像占有非常重要的地位,特別是在實(shí)用的圖像處理中,以二值圖像處理實(shí)現(xiàn)而構(gòu)成的系統(tǒng)是很多的,要進(jìn)行二值圖像的處理與分析,首先要把灰度圖像二值化,得到二值化圖像,這樣子有利于再

12、對(duì)圖像做進(jìn)一步處理時(shí),圖像的集合性質(zhì)只與像素值為0或255的點(diǎn)的位置有關(guān),不再涉及像素的多級(jí)值,使處理變得簡(jiǎn)單,而且數(shù)據(jù)的處理和壓縮量小。為了得到理想的二值圖像,一般采用封閉、連通的邊界定義不交疊的區(qū)域。所有灰度大于或等于閥值的像素被判定為屬于特定物體,其灰度值為255表示,否則這些像素點(diǎn)被排除在物體區(qū)域以外,灰度值為0,表示背景或者例外的物體區(qū)域。如果某特定物體在內(nèi)部有均勻一致的灰度值,并且其處在一個(gè)具有其他等級(jí)灰度值的均勻背景下,使用閥值法就可以得到比較的分割效果。如果物體同背景的差別表現(xiàn)不在灰度值上(比如紋理不同),可以將這個(gè)差別特征轉(zhuǎn)換為灰度的差別,然后利用閥值選取技術(shù)來(lái)分割該圖像。動(dòng)

13、態(tài)調(diào)節(jié)閥值實(shí)現(xiàn)圖像的二值化可動(dòng)態(tài)觀察其分割圖像的具體結(jié)果。2、 圖像的反色原理 對(duì)于彩色圖像的R、G、B各彩色分量取反的技術(shù)就是圖像的反色處理,這在處理二值化圖像的連通區(qū)域選取的時(shí)候非常重要。如物體連通域用黑色表示,而二值化后的物體連通域圖像可那是白色的,而背景是黑色的,這時(shí)應(yīng)手動(dòng)選取圖像的反色處理或有程序根據(jù)背景和物體連通域兩種顏色的數(shù)量所占比例而自動(dòng)選擇是否選擇選取圖像的反色處理四、讀寫(xiě)轉(zhuǎn)換代碼#include<math.h>#include <iomanip.h> #include <stdlib.h>#include <windows.h>

14、;#include <stdio.h>#include <stdlib.h>#include <iostream.h>#include <fstream.h>/-/以下該模塊是完成BMP圖像(彩色圖像是24bit RGB各8bit)的像素獲取,并存在文件名為xiang_su_zhi.txt中unsigned char *pBmpBuf;/讀入圖像數(shù)據(jù)的指針int bmpWidth;/圖像的寬int bmpHeight;/圖像的高RGBQUAD *pColorTable;/顏色表指針int biBitCount;/圖像類型,每像素位數(shù)/-/讀圖像的

15、位圖數(shù)據(jù)、寬、高、顏色表及每像素位數(shù)等數(shù)據(jù)進(jìn)內(nèi)存,存放在相應(yīng)的全局變量中bool readBmp(char *bmpName) FILE *fp=fopen(bmpName,"rb");/二進(jìn)制讀方式打開(kāi)指定的圖像文件 if(fp=0) return 0; /跳過(guò)位圖文件頭結(jié)構(gòu)BITMAPFILEHEADER fseek(fp, sizeof(BITMAPFILEHEADER),0); /定義位圖信息頭結(jié)構(gòu)變量,讀取位圖信息頭進(jìn)內(nèi)存,存放在變量head中 BITMAPINFOHEADER head; fread(&head, sizeof(BITMAPINFOHEA

16、DER), 1,fp); /獲取圖像寬、高、每像素所占位數(shù)等信息 bmpWidth = head.biWidth; bmpHeight = head.biHeight; biBitCount = head.biBitCount;/定義變量,計(jì)算圖像每行像素所占的字節(jié)數(shù)(必須是4的倍數(shù)) int lineByte=(bmpWidth * biBitCount/8+3)/4*4;/灰度圖像有顏色表,且顏色表表項(xiàng)為256 if(biBitCount=8) /申請(qǐng)顏色表所需要的空間,讀顏色表進(jìn)內(nèi)存 pColorTable=new RGBQUAD256; fread(pColorTable,sizeof

17、(RGBQUAD),256,fp); /申請(qǐng)位圖數(shù)據(jù)所需要的空間,讀位圖數(shù)據(jù)進(jìn)內(nèi)存 pBmpBuf=new unsigned charlineByte * bmpHeight; fread(pBmpBuf,1,lineByte * bmpHeight,fp); fclose(fp);/關(guān)閉文件 return 1;/讀取文件成功/-/給定一個(gè)圖像位圖數(shù)據(jù)、寬、高、顏色表指針及每像素所占的位數(shù)等信息,將其寫(xiě)到指定文件中bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, R

18、GBQUAD *pColorTable) /如果位圖數(shù)據(jù)指針為0,則沒(méi)有數(shù)據(jù)傳入,函數(shù)返回 if(!imgBuf) return 0; /顏色表大小,以字節(jié)為單位,灰度圖像顏色表為1024字節(jié),彩色圖像顏色表大小為0 int colorTablesize=0; if(biBitCount=8) colorTablesize=1024; /待存儲(chǔ)圖像數(shù)據(jù)每行字節(jié)數(shù)為4的倍數(shù) int lineByte=(width * biBitCount/8+3)/4*4; /以二進(jìn)制寫(xiě)的方式打開(kāi)文件 FILE *fp=fopen(bmpName,"wb"); if(fp=0) return

19、 0; /申請(qǐng)位圖文件頭結(jié)構(gòu)變量,填寫(xiě)文件頭信息 BITMAPFILEHEADER fileHead; fileHead.bfType = 0x4D42;/bmp類型 /bfSize是圖像文件4個(gè)組成部分之和 fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte*height; fileHead.bfReserved1 = 0; fileHead.bfReserved2 = 0; /bfOffBits是圖像文件前3個(gè)部分所需空間之和 fileHead.bf

20、OffBits=54+colorTablesize; /寫(xiě)文件頭進(jìn)文件 fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp); /申請(qǐng)位圖信息頭結(jié)構(gòu)變量,填寫(xiě)信息頭信息 BITMAPINFOHEADER head; head.biBitCount=biBitCount; head.biClrImportant=0; head.biClrUsed=0; head.biCompression=0; head.biHeight=height; head.biPlanes=1; head.biSize=40; head.biSizeImage=li

21、neByte*height; head.biWidth=width; head.biXPelsPerMeter=0; head.biYPelsPerMeter=0; /寫(xiě)位圖信息頭進(jìn)內(nèi)存 fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp); /如果灰度圖像,有顏色表,寫(xiě)入文件 if(biBitCount=8) fwrite(pColorTable, sizeof(RGBQUAD),256, fp); /寫(xiě)位圖數(shù)據(jù)進(jìn)文件 fwrite(imgBuf, height*lineByte, 1, fp); /關(guān)閉文件 fclose(fp); return

22、 1;/-/以下為像素的讀取函數(shù)void doIt() /讀入指定BMP文件進(jìn)內(nèi)存 char readPath="D:pic24dog.BMP" readBmp(readPath); /輸出圖像的信息 cout<<"width="<<bmpWidth<<" height="<<bmpHeight<<" biBitCount="<<biBitCount<<endl; /循環(huán)變量,圖像的坐標(biāo) /每行字節(jié)數(shù) int lineByte=(b

23、mpWidth*biBitCount/8+3)/4*4; /循環(huán)變量,針對(duì)彩色圖像,遍歷每像素的三個(gè)分量 int m=0,n=0,count_xiang_su=0; /將圖像左下角1/4部分置成黑色 ofstream outfile("圖像像素.txt",ios:in|ios:trunc); if(biBitCount=8) /對(duì)于灰度圖像 /- /以下完成圖像的分割成8*8小單元,并把像素值存儲(chǔ)到指定文本中。由于BMP圖像的像素?cái)?shù)據(jù)是從 /左下角:由左往右,由上往下逐行掃描的 int L1=0; int hang=63; int lie=0; /int L2=0; /in

24、t fen_ge=8; for(int fen_ge_hang=0;fen_ge_hang<8;fen_ge_hang+)/64*64矩陣行循環(huán) for(int fen_ge_lie=0;fen_ge_lie<8;fen_ge_lie+)/64*64列矩陣循環(huán) /- for(L1=hang;L1>hang-8;L1-)/8*8矩陣行 for(int L2=lie;L2<lie+8;L2+)/8*8矩陣列 m=*(pBmpBuf+L1*lineByte+L2); outfile<<m<<" " count_xiang_su+;

25、if(count_xiang_su%8=0)/每8*8矩陣讀入文本文件 outfile<<endl; /- hang=63-fen_ge_hang*8;/64*64矩陣行變換 lie+=8;/64*64矩陣列變換 /該一行(64)由8個(gè)8*8矩陣的行組成 hang-=8;/64*64矩陣的列變換 lie=0;/64*64juzhen /double xiang_su2048; /ofstream outfile("xiang_su_zhi.txt",ios:in|ios:trunc); if(!outfile) cout<<"open error!"<<endl; exit(1); else if(b

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論