怎么读取和显示灰度bmp图片
如何读取和显示灰度bmp图片
建了一个单文档。要在哪些地方加代码,就能读取和显示灰度bmp的图片。
能具体点就万分感谢了!!
------解决方案--------------------
我曾经在这里写过。
很详细,因为我刚搞明白是怎么回事!
http://chendandantj.spaces.live.com/
------解决方案--------------------
BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
CFile file;//定义一个文件类
CFileException fe;//定义如果出错将进行如何处理
if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
{
AfxMessageBox( "文件打不开 ");//打开文件失败
return FALSE;
}
DeleteContents();//删除文件中的内容
BeginWaitCursor();//图表变成等待形状
BITMAPFILEHEADER bmfHeader;//定义位图文件头
DWORD dwBitsSize;//位图大小
HANDLE hDIB;//位图句柄
LPSTR pDIB;//指向位图的指针
BITMAPINFOHEADER *bmhdr;//指向位图信息头的指针
dwBitsSize = file.GetLength();//获取文件大小
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) !=
sizeof(bmfHeader))//检查读取到的文件头大小跟实际的是否相等
return FALSE;//不等的话返回
if (bmfHeader.bfType != 0x4d42) file://检查是否为BMP文件
return FALSE;
hDIB=(HANDLE) ::GlobalAlloc(GMEM_MOVEABLE |
GMEM_ZEROINIT, dwBitsSize);
file://申请缓冲区
if (hDIB == 0)
{
return FALSE;
}
pDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
file://得到申请的缓冲区的指针
if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
dwBitsSize - sizeof(BITMAPFILEHEADER) )//判断读取到的(文件的总大小-文件头的大小)是否与实际的相等
{
::GlobalUnlock((HGLOBAL)hDIB);//释放缓冲区
hDIB=NULL;
return FALSE;
}//读数据,包括位图信息、位图颜色表、图像像素的灰度值
bmhdr=(BITMAPINFOHEADER*)pDIB;//为指向位图信息头结构的指针付值
::GlobalUnlock((HGLOBAL)hDIB);
if ((*bmhdr).biBitCount!=8) file://验证是否为8bit位图
return FALSE;
m_hDIB=hDIB;
InitDIBData();
file://自定义函数,根据读入的数据得到位图的宽、高、颜色表
file:// 来得到初始化视的尺寸、生成调色板
EndWaitCursor();
SetPathName(lpszPathName);//设置存储路径
SetModifiedFlag(FALSE); // 设置文件修改标志为FALSE
return TRUE;
}
建了一个单文档。要在哪些地方加代码,就能读取和显示灰度bmp的图片。
能具体点就万分感谢了!!
------解决方案--------------------
我曾经在这里写过。
很详细,因为我刚搞明白是怎么回事!
http://chendandantj.spaces.live.com/
------解决方案--------------------
BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
CFile file;//定义一个文件类
CFileException fe;//定义如果出错将进行如何处理
if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
{
AfxMessageBox( "文件打不开 ");//打开文件失败
return FALSE;
}
DeleteContents();//删除文件中的内容
BeginWaitCursor();//图表变成等待形状
BITMAPFILEHEADER bmfHeader;//定义位图文件头
DWORD dwBitsSize;//位图大小
HANDLE hDIB;//位图句柄
LPSTR pDIB;//指向位图的指针
BITMAPINFOHEADER *bmhdr;//指向位图信息头的指针
dwBitsSize = file.GetLength();//获取文件大小
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) !=
sizeof(bmfHeader))//检查读取到的文件头大小跟实际的是否相等
return FALSE;//不等的话返回
if (bmfHeader.bfType != 0x4d42) file://检查是否为BMP文件
return FALSE;
hDIB=(HANDLE) ::GlobalAlloc(GMEM_MOVEABLE |
GMEM_ZEROINIT, dwBitsSize);
file://申请缓冲区
if (hDIB == 0)
{
return FALSE;
}
pDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
file://得到申请的缓冲区的指针
if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
dwBitsSize - sizeof(BITMAPFILEHEADER) )//判断读取到的(文件的总大小-文件头的大小)是否与实际的相等
{
::GlobalUnlock((HGLOBAL)hDIB);//释放缓冲区
hDIB=NULL;
return FALSE;
}//读数据,包括位图信息、位图颜色表、图像像素的灰度值
bmhdr=(BITMAPINFOHEADER*)pDIB;//为指向位图信息头结构的指针付值
::GlobalUnlock((HGLOBAL)hDIB);
if ((*bmhdr).biBitCount!=8) file://验证是否为8bit位图
return FALSE;
m_hDIB=hDIB;
InitDIBData();
file://自定义函数,根据读入的数据得到位图的宽、高、颜色表
file:// 来得到初始化视的尺寸、生成调色板
EndWaitCursor();
SetPathName(lpszPathName);//设置存储路径
SetModifiedFlag(FALSE); // 设置文件修改标志为FALSE
return TRUE;
}