读写windows的位图文件(bitmap)

我们这里以RGB24来举例说明windows的位图文件的读写

 

首先说明2点:

1. 位图数据部分是从下到上,从左到右的顺序存放

2. 位图数据是不是RGB格式而是BGR格式

 

windows定义2个结构用来描述位图文件头:

BITMAPFILEHEADER

typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

 

BITMAPINFOHEADER

typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;
        LONG       biWidth;
        LONG       biHeight;
        WORD       biPlanes;
        WORD       biBitCount;
        DWORD      biCompression;
        DWORD      biSizeImage;
        LONG       biXPelsPerMeter;
        LONG       biYPelsPerMeter;
        DWORD      biClrUsed;
        DWORD      biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

这2个结构后面就是真实位图数据部分

 

下面给出个实例:

                char szPic[256] = { 0 };
                sprintf( szPic, "decoded/%d.bmp", video_frame_count );
                FILE *pf = fopen(szPic,"wb");
                if ( NULL != pf )
                {
                    BITMAPFILEHEADER bmpFileHeader = {0};
                    bmpFileHeader.bfReserved1 = 0;
                    bmpFileHeader.bfReserved2 = 0;
                    bmpFileHeader.bfType = 0x4D42;
                    bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + frame->width * frame->height * 3;
                    bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
                    BITMAPINFOHEADER bmiHeader = { 0 };
                    bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
                    bmiHeader.biWidth = frame->width;
                    bmiHeader.biHeight = 0 – frame->height;
                    bmiHeader.biPlanes = 1;
                    bmiHeader.biBitCount = 24;
                    bmiHeader.biCompression = BI_RGB;
                    bmiHeader.biSizeImage = 0;
                    bmiHeader.biXPelsPerMeter = 0;
                    bmiHeader.biYPelsPerMeter = 0;
                    bmiHeader.biClrUsed = 0;
                    bmiHeader.biClrImportant = 0;
                    fwrite( &bmpFileHeader, 1, sizeof(BITMAPFILEHEADER), pf );
                    fwrite( &bmiHeader, 1, sizeof(BITMAPINFOHEADER), pf );
                    fwrite( pic.data[0], 1, frame->width * frame->height * 3, pf );
                    fclose( pf );
                }

注意上面打开文件的那一行,标为红色的部分,一定要以2进制的形式打开,b就是表示二进制。

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *