19,468
社区成员
发帖
与我相关
我的任务
分享
//以下是读取BMP文件的函数以及绘图的函数,未注释的部分可略过
bool CDib::OpenBMP(const char* pszFile)
{
CFile fn;
DWORD dwDibSize;
BITMAPFILEHEADER BMPFH;
RGBQUAD *pPalette;
if(!fn.Open(pszFile,CFile::modeRead)) return false;
dwDibSize = fn.GetLength() - sizeof(BITMAPINFOHEADER);
if(!(m_pDibFile = new unsigned char [dwDibSize])) return false;
try
{
if ( fn.Read(&BMPFH, sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER) ||
BMPFH.bfType != 'MB' || fn.Read(m_pDibFile, dwDibSize) != dwDibSize)
{
delete[] m_pDibFile;
m_pDibFile = NULL;
fn.Close();
return false;
}
}
catch (CFileException *e)
{
e->Delete();
delete[] m_pDibFile;
m_pDibFile = NULL;
fn.Close();
return false;
}
fn.Close();
//位图信息头
m_BMPIH = *(BITMAPINFOHEADER*)m_pDibFile;
//紧接着是彩色表
pPalette = (RGBQUAD*)&m_pDibFile[sizeof(BITMAPINFOHEADER)];
//色板的颜色个数
if(m_BMPIH.biBitCount > 8)
m_nPaletteN = 0;
else if(m_BMPIH.biClrUsed != 0)
m_nPaletteN = m_BMPIH.biClrUsed;
else
m_nPaletteN = 1 << m_BMPIH.biBitCount;
//图像数据
m_pDibData = &m_pDibFile[sizeof(BITMAPINFOHEADER) + m_nPaletteN * sizeof (RGBQUAD)];
if(m_Palette.GetSafeHandle() != NULL)
m_Palette.DeleteObject();
//如果有色板,则用彩色表建立一个对应的CPalette
if(m_nPaletteN)
{
LOGPALETTE* pLogPal = (LOGPALETTE*)new char[sizeof(LOGPALETTE) + m_nPaletteN *sizeof(PALETTEENTRY)];
if(pLogPal == NULL)
{
delete[] m_pDibFile;
m_pDibFile = NULL;
return false;
}
pLogPal->palVersion = 0x300;
pLogPal->palNumEntries = m_nPaletteN;
for (int i = 0; i < m_nPaletteN; i++)
{
pLogPal->palPalEntry[i].peRed = pPalette[i].rgbRed;
pLogPal->palPalEntry[i].peGreen = pPalette[i].rgbGreen;
pLogPal->palPalEntry[i].peBlue = pPalette[i].rgbBlue;
pLogPal->palPalEntry[i].peFlags = 0;
}
m_Palette.CreatePalette(pLogPal);
delete pLogPal;
}
return true;
}
bool CDib::Draw(CDC* pDC, int X, int Y, int Width, int Height, int MODE)
{
if(m_pDibData == NULL) return false;
if(Width == -1) Width = m_BMPIH.biWidth;
if(Height == -1) Height = m_BMPIH.biHeight;
//if(m_pDibFile != NULL)
//目标CDC的色板没有做改动,参数DIB_PAL_COLORS表示BITMAPINFO中已包含调色板
//m_pDibFile为除去文件头后的文件数据,包含信息头与彩色表
StretchDIBits(pDC->m_hDC, X, Y, Width, Height, 0, 0, m_BMPIH.biWidth, m_BMPIH.biHeight, m_pDibData, (BITMAPINFO*)m_pDibFile, DIB_PAL_COLORS, MODE);
return true;
}