mfc把rgb圖像數據存爲bmp文件

網上一堆的說法,我用了都不行,包括那個寫好的和我差不多的。

不過我只要存成24位的圖就行了。以下上代碼:

typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER


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


void SaveBMP()

{

    HANDLE fh;//文件句柄
    BITMAPFILEHEADER bmfHdr; //位圖文件頭結構    
    BITMAPINFOHEADER bmfInfo; //位圖信息頭結構  
    DWORD bmwidth,bmsize,dwWritten,dwDIBSize;
    BYTE *pBmpBuff=new BYTE [m_Width*m_Height*3];//數據內存
    CString BMPname;//文件名字


    fh = CreateFile(BMPname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,  
            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);    

        if (fh != INVALID_HANDLE_VALUE)   
        {
            bmwidth=(((m_Width*24)+31)>>5)<<2;
            bmsize=bmwidth*m_Height;
            //   設置位圖文件頭    
            bmfHdr.bfType = 0x4D42;     //   "BM"    
            dwDIBSize = sizeof (BITMAPFILEHEADER)       
                + sizeof (BITMAPINFOHEADER)    
                + bmsize;      
            bmfHdr.bfSize = dwDIBSize;    
            bmfHdr.bfReserved1 = 0;    
            bmfHdr.bfReserved2 = 0;    
            bmfHdr.bfOffBits = (DWORD)sizeof (BITMAPFILEHEADER)     
                + (DWORD)sizeof (BITMAPINFOHEADER);   

            bmfInfo.biSize = sizeof (BITMAPINFOHEADER);    
            bmfInfo.biWidth = m_Width;    
            bmfInfo.biHeight = m_Height;    
            bmfInfo.biPlanes = 1;      
            bmfInfo.biBitCount = 24;    
            bmfInfo.biCompression = BI_RGB;    
            bmfInfo.biSizeImage = 0;    
            bmfInfo.biXPelsPerMeter = 0;    
            bmfInfo.biYPelsPerMeter = 0;    
            bmfInfo.biClrUsed = 0;    
            bmfInfo.biClrImportant = 0;
            //   寫入位圖文件頭    
            WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
            //   寫入位圖信息頭
            WriteFile(fh, (LPSTR)&bmfInfo, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
            //   寫入位圖像素    
            WriteFile(fh, (LPSTR)pBmpBuff, bmsize,  
                &dwWritten, NULL);  
            CloseHandle(fh);
    }
    delete pBmpBuff;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章