[圖像格式]BMP圖像格式

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.csdn.net/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?

 

posted on 2015-03-18 19:48  七月聽雪  阅读(287)  评论(0)    收藏  举报

导航