給影象資料加上BMP檔案頭
阿新 • • 發佈:2019-01-07
需要將攝像頭採集到的影象資料(純淨的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