目录
前言
前面已经写过一篇 linux下位图结构解析(一),但是对于位图结构体还是写的不够完美。这篇博客主要提供一个更好的位图源文件定义。看起来会清爽很多!
代码
#ifndef BMP_H
#define BMP_H
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
#pragma pack(1)
// Define BMP file header
typedef struct tagBITMAPFILEHEADER
{
u16 bfType;
u32 bfSize;
u32 bfReserved;
u32 bfOffBits;
}BITMAPFILEHEADER_t;
// Define BMP info header
typedef struct tagBITMAPINFOHEADER
{
u32 biSize; // must be 0x28
u32 biWidth;
u32 biHeight;
u16 biPlanes; // must be 1
u16 biBitCount;
u32 biCompression;
u32 biSizeImage;
u32 biXPelsPerMeter;
u32 biYPelsPerMeter;
u32 biClrUsed;
u32 biClrImportant;
}BITMAPINFOHEADER_t;
typedef struct tagRGBQUAD
{
u8 rgbBlue;
u8 rgbGreen;
u8 rgbRed;
u8 rgbReserved;
}RGBQUAD_t;
#pragma pack()
#endif // BMP_H
bool saveAsBitMap(AVFrame* pFrameRGB, int width, int height, int iFrame)
{
FILE *pFile = NULL;
BITMAPFILEHEADER_t bmpHeader;
BITMAPINFOHEADER_t bmpInfoHeader;
char fileName[32];
int bpp = 24;
// open file
sprintf(fileName, "frame%d.bmp", iFrame);
pFile = fopen(fileName, "wb");
if(!pFile)
{
return false;
}
bmpHeader.bfType = ('M'<<8)|'B'; // 0x4D42
bmpHeader.bfReserved = 0;
bmpHeader.bfOffBits = sizeof(BITMAPFILEHEADER_t)+sizeof(BITMAPINFOHEADER_t);
bmpHeader.bfSize = bmpHeader.bfOffBits + width*height*bpp/8;
bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER_t);
bmpInfoHeader.biWidth = width;
bmpInfoHeader.biHeight = -height;
bmpInfoHeader.biPlanes = 1;
bmpInfoHeader.biBitCount = bpp;
bmpInfoHeader.biCompression = 0;
bmpInfoHeader.biSizeImage = 0;
bmpInfoHeader.biXPelsPerMeter = 0;
bmpInfoHeader.biYPelsPerMeter = 0;
bmpInfoHeader.biClrUsed = 0;
bmpInfoHeader.biClrImportant = 0;
fwrite(&bmpHeader, sizeof(BITMAPFILEHEADER_t), 1, pFile);
fwrite(&bmpInfoHeader, sizeof(BITMAPINFOHEADER_t), 1, pFile);
uint8_t *buffer = pFrameRGB->data[0];
for(int h=0; h<height; h++)
{
for(int w=0; w<width; w++)
{
fwrite(buffer+2, 1, 1, pFile);
fwrite(buffer+1, 1, 1, pFile);
fwrite(buffer, 1, 1, pFile);
buffer += 3;
}
}
fclose(pFile);
return true;
}
AVFrame是FFmpeg中的帧结构体,里面存储了图像帧数据,如果是其他的,类似的写法。
总结
感觉自己写代码越来越有洁癖了!也不知道这种习惯好不好!!! |