linux下位图结构解析(二)

本文是《linux下位图结构解析》系列的第二篇,针对位图结构体进行了更深入的探讨,提供了一份清晰易读的位图源文件定义,适用于FFmpeg中的帧数据处理。作者分享了自己对代码整洁性的追求。

目录

前言

前面已经写过一篇 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中的帧结构体,里面存储了图像帧数据,如果是其他的,类似的写法。

总结

感觉自己写代码越来越有洁癖了!也不知道这种习惯好不好!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值