BMP圖像格式包括四部分:
1.位圖文件頭(BitMapFileHeader):文件標識BM+文件大小+保留字+偏移量(三部分的大小+保留字)=14B
2.位圖信息頭(BitMapInfoHeader):
3.顏色表:記錄圖像用到的所有顏色信息
說明:1.常見的顏色模式有2,16,256,以及24位真彩圖和32位
2.每個顏色用4個字節(Byte)表示,上述的模式各需要8B,64B,1024B,2^26B,2^34B
3.每種顏色對應一個顏色的索引值,按照順序依次排列,分別為0,1,2,3....;這個顏色的索引值在圖像數據區會用到,用來指示每一個像素點的顏色
4.圖像數據區:在這個部分記錄每一個像素點的顏色信息(通過上面的顏色索引值).
說明:1.對於2色每點佔據一位(0/1),16色的每個像素點需要4位(如15=1111),以此類推
2.圖像是以字節來記錄顏色信息的,並且顯示的字節數必須是4的整數倍;
3.會有某種顏色模式,比如說16色,出現1個字節對應兩個像素點的情況,對於19寬(指的是字節)的圖像,那麼最後一個像素點只用了半個字節,這時需要在後面補上00填補
但這部分是沒有的,這會使記錄的信息大於實際的圖像信息;
4.由於2的限制,對於圖像寬度並不是4的整數倍的,需要在後面補上00,知道滿足2;
5.注意3和4補上00的區別,3指的是"像素點顏色表示"與"特定顏色模式下索引值"的對應,4指的是"顯示的要求"與"每行字節數"的對應.
附上一個將BMP圖像轉成灰度的matlab程序,參考至(http://blog.youkuaiyun.com/xiaofengsheng/article/details/5993815)
%讀取BMP,並將BMP轉化為灰度圖 %格式:BMPReader('圖像路徑') function BMPReader(strPathName) fFile = fopen(strPathName, 'rb'); [data, count] = fread(fFile); data_set=reshape(data,2,count/2); data_Set=data_set';%BMP的數據 I=imread(strPathName); %offset偏移 nOffset = 0; for i = 1:4 nOffset = nOffset + bitshift(data(10+i), (i-1)*8); end %width圖像寬度 nWidth = 0; for i = 1:4 nWidth = nWidth + bitshift(data(18+i), (i-1)*8); end %height圖像高度 nHeight = 0; for i = 1:4 nHeight = nHeight + bitshift(data(22+i), (i-1)*8); end %bit count nBitCount = data(29) + bitshift(data(30), 8); img = zeros(nWidth,nHeight); gray=zeros((count-nOffset)/3,1); %將RGB取平均,輸出灰度值 for j=1:(count-nOffset)/3 res=sum(data(nOffset+1+(j-1)*3:nOffset+3+(j-1)*3))/3; gray(j)=floor(res); end %nOffset代表偏移量,從55B後面的數據才是圖像數據, %reshape是列優先,所以img設為(W,H),下面在轉置還原 % bmp格式存储是从图片的下到上,先转置,然后上下交换 img = reshape(gray, nWidth, nHeight); img = flipud(img'); subplot(211) imshow(I),title('原圖'); subplot(212) imshow(img, [0, 255]),title('灰度圖') %close file fclose(fFile); %問題: %這個程序只是將BMP圖像的數據提取做平均,直接將這個提取出來的值作為灰度呈現 %沒有將這個數值寫入原BMP矩陣 %試圖更新BMP數據后,寫入更新沒有成功;或者寫入后圖像全白??不明白更新 %顏色數據后怎麼顯示或者存儲為圖像 %另外對BMP的顏色存儲不是很明白,既然不是三維矩陣,怎麼顯示RGB?