将Byte数组保存成24位BMP

直接上源代码:

#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;

class CSaveByteToBmp
{
public:
    bool SaveDIB2Bmp(int fileNum, const CString& BMPFileName, int iWidth, int iHeight, BYTE *pBuffer);
    void ConstructBih(int nWidth, int nHeight, BITMAPINFOHEADER& bih);
    void ContructBhh(int nWidth, int nHeight, BITMAPFILEHEADER& bhh);//add 2010-9-04;
protected:
private:

};

 

然后是cpp:

#include "stdafx.h"
#include "SaveByteToBmp.h"

//保存buffer到bmp文件
bool CSaveByteToBmp::SaveDIB2Bmp(int fileNum, const CString& BMPFileName, int iWidth, int iHeight, BYTE *pBuffer)
{
    BITMAPINFOHEADER bih;
    ConstructBih(iWidth, iHeight, bih);
    BITMAPFILEHEADER bhh;
    ContructBhh(iWidth, iHeight, bhh);

    int widthStep = (((iWidth * 24) + 31) & (~31)) / 8; //每行实际占用的大小(每行都被填充到一个4字节边界)
    int DIBSize = widthStep * iHeight;  //buffer的大小 (字节为单位)

    CFile file;
    try
    {
        if (file.Open(BMPFileName, CFile::modeWrite | CFile::modeCreate))
        {//写入文件

            file.Write((LPSTR)&bhh, sizeof(BITMAPFILEHEADER));
            file.Write((LPSTR)&bih, sizeof(BITMAPINFOHEADER));
            file.Write(pBuffer, DIBSize);
            file.Close();
            return true;
        }

    }
    catch (...)
    {
        MessageBox(NULL, _T("CSaveByteToBmp::SaveDIB2Bmp"), _T("tips"), MB_ICONERROR);
    }
    return false;
}



//构建BMP位图文件头
void CSaveByteToBmp::ContructBhh(int nWidth, int nHeight, BITMAPFILEHEADER& bhh) //add 2010-9-04
{
    int widthStep = (((nWidth * 24) + 31) & (~31)) / 8; //每行实际占用的大小(每行都被填充到一个4字节边界)
    bhh.bfType = ((WORD)('M' << 8) | 'B');  //'BM'
    bhh.bfSize = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+widthStep * nHeight;
    bhh.bfReserved1 = 0;
    bhh.bfReserved2 = 0;
    bhh.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER);

}


//构建BMP文件信息头
void CSaveByteToBmp::ConstructBih(int nWidth, int nHeight, BITMAPINFOHEADER& bih)
{
    int widthStep = (((nWidth * 24) + 31) & (~31)) / 8;

    bih.biSize = 40;       // header size
    bih.biWidth = nWidth;
    bih.biHeight = nHeight;
    bih.biPlanes = 1;
    bih.biBitCount = 24;     // RGB encoded, 24 bit
    bih.biCompression = BI_RGB;   // no compression 非压缩
    bih.biSizeImage = widthStep*nHeight * 3;
    bih.biXPelsPerMeter = 0;
    bih.biYPelsPerMeter = 0;
    bih.biClrUsed = 0;
    bih.biClrImportant = 0;

}

 

posted @ 2015-08-18 17:21  秋月的私语  阅读(980)  评论(0编辑  收藏  举报