BMP文件頭設置要點



一、使用到的結構體

  1. BMP文件頭結構。注意該結構的字節對齊,尤其是自定義該結構體時要引起高度重視,否則會引發BMP文件頭無效

typedef  struct  tagBITMAPFILEHEADER
{
 unsigned short  bfType;       //位圖文件的類型,必須爲BM
 unsigned long    bfSize;       //文件大小,以字節爲單位
 unsigned short   bfReserverd1; //位圖文件保留字,必須爲0
 unsigned short   bfReserverd2; //位圖文件保留字,必須爲0
 unsigned long     bfbfOffBits;  //位圖文件頭到數據的偏移量,以字節爲單位
}BITMAPFILEHEADER;

     2.BMP信息頭結構

typedef  struct  tagBITMAPINFOHEADER
{
 unsigned long biSize;                        //該結構大小,字節爲單位
 long  biWidth;                     //圖形寬度以象素爲單位
 long  biHeight;                     //圖形高度以象素爲單位
 unsigned short   biPlanes;               //目標設備的級別,必須爲1
 unsigned short   biBitcount;             //顏色深度,每個象素所需要的位數
 unsigned long  biCompression;        //位圖的壓縮類型
 unsigned long  biSizeImage;              //位圖的大小,以字節爲單位
 long  biXPelsPermeter;       //位圖水平分辨率,每米像素數
 long  biYPelsPermeter;       //位圖垂直分辨率,每米像素數
 unsigned long  biClrUsed;            //位圖實際使用的顏色表中的顏色數
 unsigned long  biClrImportant;       //位圖顯示過程中重要的顏色數
}BITMAPINFOHEADER;

    3.BMP顏色表結構(調色板)

typedef struct tagRGBQUAD
{
 unsigned char rgbBlue;
 unsigned char rgbGreen;
 unsigned char rgbRed;
 unsigned char rgbReserved;
}RGBQUAD;


二、數據填充

       所有保留字段都要置爲0,否則會出錯。

       圖像寬度必須爲四的整數倍((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8);

      1. BITMAPFILEHEADER

          bfType爲圖像文件格式,就此題而論,總是設置爲0x4D42即“BM”;

          bfSize爲BMP文件的大小,應設置爲:BMP文件頭大小+BMP信息頭大小+[調色板信息大小+]圖像大小,即:sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +[ 256 * sizeof(RGBQUAD) +] imgHeight * imgWidth*bytePerPixel。圖像尺寸大小不包括顏色通道數量信息;

          bfbfOffBits爲圖像數據的偏移字節。應設置爲:BMP文件大小+BMP信息頭大小[+調色板信息大小],計算方法參考上一字段;

     2.  BITMAPINFOHEADER

         biSize該結構大小,一般設置爲40,推薦使用sizeof(BITMAPINFOHEADER)方式設置;

         biWidth 圖像寬度,毋庸多言;

         biSizeImage

         biHeight 圖像高度;

         biPlanes 位圖的位面數(目標設備級別),此處設置爲1;但也有設置爲零的,可見不一定爲1;

         biBitcount 位圖每個像素所需位數,根據實際情況設置;1:爲雙色;4:十六色;8:256色;24或32:真彩色;

         biCompression位圖壓縮類型,必須是0; 1:BI_RLE8壓縮類型;2:BI_RLE4壓縮類型;3:Bitfields,位域存放;

                                                                                 RLE:全稱(run-length encoding),翻譯爲遊程編碼;

         biSizeImage位圖數據大小,即imgHeight*imgWidth*bytePerPixel;

        biXPelsPermeter用像素/米表示的水平分辨率

        biYPelsPermeter用像素/米表示的垂直分辨率

        biClrUsed位圖所使用的顏色數

        biClrImportant對位圖顯示有重要影響的顏色索引數。如果爲零,意味着都重要;

       3. RGBQUAD

       rgbBlue藍色分量的亮度0~255;

       rgbGreen綠色分量的亮度0~255;

       rgbRed紅色分量的亮度0~255;

       rgbReserved保留分量,個人分析是Alpha分量的值,該值必須爲0;

      4.位圖數據部分

       上下左右倒置結構,左上角的像素點位於文件結尾,右下角的像素數據位於位圖數據段的起點。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章