目录
前言
前面已经写过一篇 linux下位图结构解析(一),但是对于位图结构体还是写的不够完美。这篇博客主要提供一个更好的位图源文件定义。看起来会清爽很多!
代码
- bmp.h
#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
- bmp.c
- savebmp.c
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中的帧结构体,里面存储了图像帧数据,如果是其他的,类似的写法。
总结
感觉自己写代码越来越有洁癖了!也不知道这种习惯好不好!!!
本文是《linux下位图结构解析》系列的第二篇,针对位图结构体进行了更深入的探讨,提供了一份清晰易读的位图源文件定义,适用于FFmpeg中的帧数据处理。作者分享了自己对代码整洁性的追求。
&spm=1001.2101.3001.5002&articleId=79087867&d=1&t=3&u=7a29dfb6ea214d978b1f5977f0923e8b)
1991

被折叠的 条评论
为什么被折叠?



