linux下位图结构解析(二)

论坛 期权论坛 脚本     
匿名网站用户   2020-12-21 09:09   184   0

目录

前言

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

总结

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP