自定义一个位图处理类,生成的位图文件无法用画图工具打开,请各位高手帮忙看一下!
自定义一个位图处理类,用来生成、编辑、保存DIB位图对象,目前利用这个类生成的BMP文件无法用WINDOWS自带画图工具打开,请各位高手帮我看一下程序哪些地方有问题。这是小弟写的第一个c++程序,请各位不吝赐教!
========================================================================
头文件:
class CBitMapUtil
{
private:
HBITMAP m_hBitMap; //the handle of a bitmap object
byte* m_pBmpBits; //pointer to bitmap bits data
BITMAPFILEHEADER hBmpFhd;
LPBITMAPINFO lpBmpInfo;
private:
bool CreateBitMap(LPBITMAPINFO lpBmpInfo, void* lpSrcBits); //create a bitmap as the defined width and height from the lpSrcBits
void CreateFileHeader();
public:
CBitMapUtil();
CBitMapUtil(int nWidth,int nHeight,UINT nBitCount); //contructor for a bitmap as defined widht and height
void SetPixel(int xPixel,int yPixel,COLORREF color); //paint point with specific color
bool SaveBitMap(LPCTSTR fileName); //save the bitmap object to disk
~CBitMapUtil();
};
========================================================================
cpp文件:
#include "stdafx.h"
#include "CBitMapUtil.h"
#include "Windef.h"
CBitMapUtil::CBitMapUtil()
{
}
/*
*/
CBitMapUtil::CBitMapUtil(int nWidth,int nHeight,UINT nbitCount)
{
ASSERT(nbitCount == 24); //only deal with 24-bit bitmap object;
lpBmpInfo = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER)];
//init BITMAPINFOHEADER
lpBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpBmpInfo->bmiHeader.biWidth = nWidth;
lpBmpInfo->bmiHeader.biHeight = nHeight;
lpBmpInfo->bmiHeader.biBitCount = nbitCount;
lpBmpInfo->bmiHeader.biPlanes = 1;
lpBmpInfo->bmiHeader.biCompression = 0;
lpBmpInfo->bmiHeader.biSizeImage = nWidth*nHeight*3 ; //may be need to be recalculated
lpBmpInfo->bmiHeader.biXPelsPerMeter = 0x0;
lpBmpInfo->bmiHeader.biYPelsPerMeter = 0x0;
lpBmpInfo->bmiHeader.biClrUsed = 0;
lpBmpInfo->bmiHeader.biClrImportant = 0;
//init m_pBmpBits
m_pBmpBits = (byte*) new BYTE[nWidth*nHeight*3];
for(int i = 0;i < sizeof(m_pBmpBits); i++)
{
m_pBmpBits[i]=(byte)0xFF; //init as white background;
}
//create bitmap object
CreateBitMap(lpBmpInfo,m_pBmpBits);
}
bool CBitMapUtil::CreateBitMap(LPBITMAPINFO lpBmpInfo,LPVOID lpSrcBits)
{
HDC hMemDC;
hMemDC = CreateCompatibleDC (NULL);
m_hBitMap = CreateDIBSection(hMemDC,lpBmpInfo,DIB_RGB_COLORS,&lpSrcBits,NULL,0);
delete hMemDC;
return true;
}
void CBitMapUtil::SetPixel(int xPixel,int yPixel,COLORREF color)
{
CDC dc;
dc.SelectObject(m_hBitMap);
dc.SetPixel(xPixel,yPixel,color);
delete dc;
}
void CBitMapUtil::CreateFileHeader()
{
hBmpFhd.bfType = (('B'<<8)|'M');
hBmpFhd.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(m_pBmpBits);
hBmpFhd.bfReserved1 = 0;
hBmpFhd.bfReserved2 = 0;
hBmpFhd.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
}
bool CBitMapUtil::SaveBitMap(LPCTSTR lpszFileName)
{
CFile file;
if (!file.Open(lpszFileName, CFile::modeWrite|CFile::modeCreate))
return FALSE;
file.Write(&hBmpFhd, sizeof(hBmpFhd));
// Write the DIB header
file.Write(lpBmpInfo, sizeof(BITMAPINFOHEADER));
// Write DIB bits
file.Write(m_pBmpBits, lpBmpInfo->bmiHeader.biSizeImage);
return TRUE;
}
CBitMapUtil::~CBitMapUtil()
{
delete m_hBitMap;
delete m_pBmpBits;
delete lpBmpInfo;
}