給RGB加上BMP檔案頭

2021-06-22 14:12:29 字數 4628 閱讀 5865

實習時需要從相機取出的純rgb資料封裝上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

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

infohead;

/***************************

/***************************

第三部分 調色盤結構 顏色表

對於256色bmp點陣圖,顏色位數為8,需要2^8 = 256個調色盤;

對於24bitbmp點陣圖,各象素rgb值直接儲存在影象資料區,不需要調色盤,不存在調色盤區

rgbblue: 該顏色的藍色分量。

rgbgreen: 該顏色的綠色分量。

rgbred: 該顏色的紅色分量。

rgbreserved:保留值。

*****************************/

typedef struct

rgbmixplate;

/*********************

/*********************

//輸入

// rgb_buffer: rgb24緩衝區指標

// nwidth : 寬度

// nheight : 高度

// fp2 : 指向加bmp頭後的資料

**************************/

int rgb2bmp1(char *rgb_buffer,int nwidth,int nheight,char*fp2)

; 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

讀取bmp檔案頭出錯

typedef struct tagbitmapfileheader bitmapfileheader bitmapfileheader bf bitmapinfoheader bi word bftype fread bftype,1,2,f1 coutcout 開始 如上,讀取的bf.bfsiz...

嵌入式Linux 讀取bmp檔案頭資訊

檔案頭結構體 typedef struct bitmapfileheader 函式如下 返回值 錯誤時返回 1,解析正確返回0 int bmp analyze unsigned char path 讀取檔案頭資訊 read fd,fheader,sizeof fheader printf bfsiz...

yuv422轉RGB888儲存bmp檔案解析

uvc相機支援v4l2程式設計,採集格式若只支援yuv422,使用libjpeg等壓縮速度降低,直接儲存bmp點陣圖速度加快 關於v4l2對於相機的初始化部分進行省略 分為幾個關鍵步驟進行轉換 1 初始化正常 2 將底層獲取與申請的記憶體存入快取進行mmap進行記憶體對映,核心空間的位址不能直接被使...