1. 程式人生 > >給影象資料加上BMP檔案頭

給影象資料加上BMP檔案頭

需要將攝像頭採集到的影象資料(純淨的RGB,或BGR資料)加上檔案頭後暫存在記憶體中

如若寫入檔案僅需將memcpy換成fwrite即可。

#ifndef RGB2BMP_H
#define RGB2BMP_H
///為拍攝的RGB資料加上BMP檔案頭
///作者:
/// 2014.6.25
///
typedef unsigned char  BYTE;
typedef unsigned short WORD;
// BMP影象各部分說明如下
/***********
    第一部分    點陣圖檔案頭
該結構的長度是固定的,為14個位元組,各個域的依次如下:
    2byte   :檔案型別,必須是0x4d42,即字串"BM"。
    4byte   :整個檔案大小
    4byte   :保留字,為0
    4byte   :從檔案頭到實際的點陣圖影象資料的偏移位元組數。
*************/
typedef struct
{    long imageSize;
    long blank;
    long startPosition;
}BmpHead;
/*********************
/*********************
第二部分    點陣圖資訊頭
該結構的長度也是固定的,為40個位元組,各個域的依次說明如下:
    4byte   :本結構的長度,值為40
    4byte   :影象的寬度是多少象素。
    4byte   :影象的高度是多少象素。
    2Byte   :必須是1。
    2Byte   :表示顏色時用到的位數,常用的值為1(黑白二色圖)、4(16色圖)、8(256色圖)、24(真彩色圖)。
    4byte   :指定點陣圖是否壓縮,有效值為BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS。Windows點陣圖可採用RLE4和RLE8的壓縮格式,BI_RGB表示不壓縮。
    4byte   :指定實際的點陣圖影象資料佔用的位元組數,可用以下的公式計算出來:
     影象資料 = Width' * Height * 表示每個象素顏色佔用的byte數(即顏色位數/8,24bit圖為3,256色為1)
     要注意的是:上述公式中的biWidth'必須是4的整數倍(不是biWidth,而是大於或等於biWidth的最小4的整數倍)。
     如果biCompression為BI_RGB,則該項可能為0。
    4byte   :目標裝置的水平解析度。
    4byte   :目標裝置的垂直解析度。
    4byte   :本影象實際用到的顏色數,如果該值為0,則用到的顏色數為2的(顏色位數)次冪,如顏色位數為8,2^8=256,即256色的點陣圖
    4byte   :指定本影象中重要的顏色數,如果該值為0,則認為所有的顏色都是重要的。
***********************************/
typedef struct

{
    long    Length;
    long    width;
    long    height;
    WORD    colorPlane;
    WORD    bitColor;
    long    zipFormat;
    long    realSize;
    long    xPels;
    long    yPels;
    long    colorUse;
    long    colorImportant;

}InfoHead;
/***************************
/***************************
    第三部分    調色盤結構  顏色表
    對於256色BMP點陣圖,顏色位數為8,需要2^8 = 256個調色盤;
    對於24bitBMP點陣圖,各象素RGB值直接儲存在影象資料區,不需要調色盤,不存在調色盤區
    rgbBlue:   該顏色的藍色分量。
    rgbGreen:  該顏色的綠色分量。
    rgbRed:    該顏色的紅色分量。
    rgbReserved:保留值。
*****************************/
typedef struct
{         BYTE   rgbBlue;
         BYTE   rgbGreen;
         BYTE   rgbRed;
         BYTE   rgbReserved;

}RGBMixPlate;
/*********************
/*********************
//輸入
// rgb_buffer: RGB24緩衝區指標
// nWidth    : 圖片寬度
// nHeight   : 圖片高度
// fp2       : 指向加bmp頭後的資料
**************************/
int RGB2BMP1(char *rgb_buffer,int nWidth,int nHeight,char*fp2)
{
     BmpHead m_BMPHeader;
     char bfType[2]={'B','M'};
     m_BMPHeader.imageSize=3*nWidth*nHeight+54;
     m_BMPHeader.blank=0;
     m_BMPHeader.startPosition=54;
     char* temp=fp2;
     memcpy(fp2,bfType,2);
     fp2+=sizeof(bfType);

     memcpy(fp2,&m_BMPHeader,sizeof(m_BMPHeader.imageSize));
     fp2+=sizeof(m_BMPHeader.imageSize);


     memcpy(fp2,&m_BMPHeader.blank,sizeof(m_BMPHeader.blank));
     fp2+=sizeof(m_BMPHeader.blank);


     memcpy(fp2,&m_BMPHeader.startPosition,sizeof(m_BMPHeader.startPosition));
     fp2+=sizeof(m_BMPHeader.startPosition);


     InfoHead  m_BMPInfoHeader;
     m_BMPInfoHeader.Length=40;
     m_BMPInfoHeader.width=nWidth;
     m_BMPInfoHeader.height=-nHeight;
     m_BMPInfoHeader.colorPlane=1;
     m_BMPInfoHeader.bitColor=24;
     m_BMPInfoHeader.zipFormat=0;
     m_BMPInfoHeader.realSize=3*nWidth*nHeight;
     m_BMPInfoHeader.xPels=0;
     m_BMPInfoHeader.yPels=0;
     m_BMPInfoHeader.colorUse=0;
     m_BMPInfoHeader.colorImportant=0;

     memcpy(fp2,&m_BMPInfoHeader.Length,sizeof(m_BMPInfoHeader.Length));
      fp2+=sizeof(m_BMPInfoHeader.Length);

     memcpy(fp2,&m_BMPInfoHeader.width,sizeof(m_BMPInfoHeader.width));
      fp2+=sizeof(m_BMPInfoHeader.width);

      memcpy(fp2,&m_BMPInfoHeader.height,sizeof(m_BMPInfoHeader.height));
      fp2+=sizeof(m_BMPInfoHeader.height);

     memcpy(fp2,&m_BMPInfoHeader.colorPlane,sizeof(m_BMPInfoHeader.colorPlane));
     fp2+=sizeof(m_BMPInfoHeader.colorPlane);

     memcpy(fp2,&m_BMPInfoHeader.bitColor,sizeof(m_BMPInfoHeader.bitColor));
     fp2+=sizeof(m_BMPInfoHeader.bitColor);


     memcpy(fp2,&m_BMPInfoHeader.zipFormat,sizeof(m_BMPInfoHeader.zipFormat));
     fp2+=sizeof(m_BMPInfoHeader.zipFormat);

     memcpy(fp2,&m_BMPInfoHeader.realSize,sizeof(m_BMPInfoHeader.realSize));
     fp2+=sizeof(m_BMPInfoHeader.realSize);

     memcpy(fp2,&m_BMPInfoHeader.xPels,sizeof(m_BMPInfoHeader.xPels));
     fp2+=sizeof(m_BMPInfoHeader.xPels);

     memcpy(fp2,&m_BMPInfoHeader.yPels,sizeof(m_BMPInfoHeader.yPels));
     fp2+=sizeof(m_BMPInfoHeader.yPels);

     memcpy(fp2,&m_BMPInfoHeader.colorUse,sizeof(m_BMPInfoHeader.colorUse));
     fp2+=sizeof(m_BMPInfoHeader.colorUse);

     memcpy(fp2,&m_BMPInfoHeader.colorImportant,sizeof(m_BMPInfoHeader.colorImportant));
     fp2+=sizeof(m_BMPInfoHeader.colorImportant);

     memcpy(fp2,rgb_buffer,3*nWidth*nHeight);
     fp2=temp;
     return 1;
}

#endif // RGB2BMP_H