class ...Doc
{
...
public:
BITMAPINFOHEADER m_bih;
RGBQUAD *m_pQuad;
BYTE *m_lpBuf;
BITMAPINFO *m_pbi;
int m_nFlags; //记录状态:是否有数据读取
int m_nQuad; //表示调色板的数量
...
};
void CBmpViewDoc::OnFileOpen()
{
LPCTSTR lpszFilter=_T(\"BMP Files(*.bmp)|*.bmp|任何文件*.*||\");
CFileDialog fileDlg(TRUE,lpszFilter,NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,lpszFilter,NULL);
CString filename;
CFile file;
BITMAPFILEHEADER bf;if (IDOK==fileDlg.DoModal())
{
filename=fileDlg.GetPathName();
// AfxMessageBox((LPCTSTR)filename);
if(file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
{
AfxMessageBox(_T(\"无法打开文件!\"));
return;
}
//读取文件头
file.Read(&bf,sizeof(bf));if (bf.bfType!=0x4d42)//判断是否为BMP文件
{
AfxMessageBox(_T(\"非BMP文件!\"));
return;
}
if (file.GetLength()!=bf.bfSize)
{
AfxMessageBox(_T(\"文件损坏!\"));
return;
}
//读取信息头
file.Read(&m_bih,sizeof(m_bih));
/* CString str;
str.Format(_T(\"%d位\"),m_bih.biBitCount);
AfxMessageBox(str);*/m_nQuad=0;
if (m_bih.biBitCount<24)
{
m_nQuad=1<<m_bih.biBitCount;
}
//为BITMAPINFO结构类型指针分配内存
m_pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,
m_nQuad*sizeof(RGBQUAD)+sizeof(BITMAPINFOHEADER));//将信息头放进这快内存,首对齐
memcpy(m_pbi,&m_bih,sizeof(m_bih));//将调色板指针指向BITMAPINFO指针指向的一大快内存中属于自己的那部分的起点
m_pQuad=(RGBQUAD*)((BYTE*)m_pbi+sizeof(BITMAPINFOHEADER));//读取调色板信息
if (m_nQuad!=0)
{
file.Read(m_pQuad,m_nQuad*sizeof(RGBQUAD));
}
m_bih.biSizeImage=bf.bfSize-bf.bfOffBits;
m_lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,m_bih.biSizeImage);//读取图象数据内容
file.Read(m_lpBuf,m_bih.biSizeImage);//读取完毕,关闭文件。
file.Close();
//读取成功
m_nFlags=1;
//显示
UpdateAllViews(NULL,0,NULL);
}
// CBmpViewView 消息处理程序void CBmpViewView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CView::OnPaint() for painting messages
CBmpViewDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);if (pDoc->m_nFlags==1)
{
SetDIBitsToDevice(dc.m_hDC,0,0,pDoc->m_pbi->bmiHeader.biWidth,
pDoc->m_pbi->bmiHeader.biHeight,0,0,0,pDoc->m_pbi->bmiHeader.biHeight,
pDoc->m_lpBuf,pDoc->m_pbi,DIB_RGB_COLORS);
}
}
为什么我读出来的全是黑色啊?