把RGB数据写入BMP文件

bool Write555BitImg2BmpFile(u8 *pImg, int width, int height, const char * filename)
{
typedef unsigned long       DWORD;
typedef unsigned short      WORD;
typedef          long       LONG;

#pragma pack (push ,1)  //把原来对齐方式设置压栈,并设新的对齐方式
typedef struct _tagBITMAPFILEHEADER {
    WORD    bfType;
    DWORD   bfSize;
    WORD    bfReserved1;
    WORD    bfReserved2;
    DWORD   bfOffBits;
} BITMAPFILEHEADER;
#pragma pack (pop)  //恢复对齐状态

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;

    FILE *BinFile;
    BITMAPFILEHEADER FileHeader;
    BITMAPINFOHEADER BmpHeader;
    WORD *pCur = (WORD *)pImg;
    u8 bgr[3];

    // Open File  
    if ((BinFile = fopen(filename, "w+b")) == NULL) 
    { 
        printf("Error to open %s\n",filename);
        return false; 
    }
    
    // Fill the FileHeader    
    FileHeader.bfType = 0x4d42;//((WORD)('M' << 8) | 'B');
    FileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //14 + 40 = 54
    FileHeader.bfSize = FileHeader.bfOffBits + width*height * 3L;
    FileHeader.bfReserved1 = 0;
    FileHeader.bfReserved2 = 0;
    if (fwrite((void*)&FileHeader, 1, sizeof(BITMAPFILEHEADER), BinFile) != sizeof(BITMAPFILEHEADER))
    {
        printf("Error to fwrite BITMAPFILEHEADER \r\n");
        fclose(BinFile);
        return false; 
    }  
    
    // Fill the ImgHeader  
    BmpHeader.biSize = sizeof(BITMAPINFOHEADER);
    BmpHeader.biWidth = width;
    BmpHeader.biHeight = -height;//当RGB数据是从位图最后一个点开始扫描,直接写入得到的图片是倒着的,这时用-height,这样图片就正了
    BmpHeader.biPlanes = 1;
    BmpHeader.biBitCount = 24;
    BmpHeader.biCompression = 0;
    BmpHeader.biSizeImage = width*height * 3L;
    BmpHeader.biXPelsPerMeter = 0;
    BmpHeader.biYPelsPerMeter = 0;
    BmpHeader.biClrUsed = 0;
    BmpHeader.biClrImportant = 0;
    
    if (fwrite((void*)&BmpHeader, 1, sizeof(BITMAPINFOHEADER), BinFile) != sizeof(BITMAPINFOHEADER))
    {
        printf("Error to fwrite BITMAPINFOHEADER \r\n");
        fclose(BinFile);
        return false; 
    }
    
    for (int i = 0; i < width * height; i++)
    {
        bgr[0] = ((*pCur) & 0x1F) << 3;  //B
        bgr[1] = ((*pCur) & (0x1F << 5)) >> 2;  //G
        bgr[2] = ((*pCur) & (0x1F << 10)) >> 7;  //R
        pCur++;
        fwrite((void *)&bgr, 1, 3, BinFile);
    }

    fclose(BinFile);
    return true;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值