请教高手:BMP图片打开后 怎么读取其数据?打开后的图片数据存放在哪里?
BOOL CImg::AttachFromFile(LPCTSTR lpcPathName)
{
// 使用CFile对象简化操作
CFile file;
if(!file.Open(lpcPathName, CFile::modeRead|CFile::shareDenyWrite))
return FALSE; BOOL bSuc = AttachFromFile(file); file.Close();
return bSuc;
}/**************************************************
BOOL CImg::AttachFromFile(CFile &file)功能:
打开指定的图像文件并附加到CImg对象上
限制:
只能处理位图图像参数:
CFile &file
欲打开的CFile对象
返回值:
BYTE类型,TRUE为成功,FALSE为失败
***************************************************/BOOL CImg::AttachFromFile(CFile &file)
{
// 文件数据
LPBYTE  *lpData;
// 位图信息头
BITMAPINFOHEADER *pBMIH;
//add BITMAPFILEHEADER *pBMFH;
//BITMAPFILEHEADER *pBMFH;
// 颜色表指针
LPVOID lpvColorTable = NULL;
// 颜色表颜色数目
int nColorTableEntries; BITMAPFILEHEADER bmfHeader; // 读取文件头
if(!file.Read(&bmfHeader, sizeof(bmfHeader)))
return FALSE;
// 检查开头两字节是否为BM
if(bmfHeader.bfType != MAKEWORD('B', 'M'))
{
return FALSE;
} // 读取信息头
pBMIH = (BITMAPINFOHEADER*)new BYTE[bmfHeader.bfOffBits - sizeof(bmfHeader)];
if(!file.Read(pBMIH, bmfHeader.bfOffBits - sizeof(bmfHeader)))
{
delete pBMIH;
return FALSE;
} // 定位到颜色表  测试
int aa=sizeof(RGBQUAD);
int bb=sizeof(BITMAPINFOHEADER); nColorTableEntries = 
(bmfHeader.bfOffBits - sizeof(bmfHeader) - sizeof(BITMAPINFOHEADER))/sizeof(RGBQUAD); if(nColorTableEntries > 0)
{
lpvColorTable = pBMIH + 1;
} pBMIH->biHeight = abs(pBMIH->biHeight); // 读取图像数据,WIDTHBYTES宏用于生成每行字节数
int nWidthBytes = WIDTHBYTES((pBMIH->biWidth)*pBMIH->biBitCount); // 申请biHeight个长度为biWidthBytes的数组,用他们来保存位图数据
lpData = new LPBYTE[(pBMIH->biHeight)];
for(int i=0; i<(pBMIH->biHeight); i++)
{
lpData[i] = new BYTE[nWidthBytes];
file.Read(lpData[i], nWidthBytes);

} // 更新数据
CleanUp();
//////////////////////////////////////////////////////////////////////////
m_lpData = lpData;
m_pBMIH = pBMIH; m_lpvColorTable = lpvColorTable;
m_nColorTableEntries = nColorTableEntries;

 
return TRUE;
}