问题是这样的:我现在打开一幅图象进行处理,我用的是邮电的《vc数字图象处理》的ReadDIBFile这个函数,只不过是将多文档改成了单文档。我基本是直接copy过来的,但是不知为什么图象老是出现错位,左边的到了右边,右边的到了左边,还不是从正中间错位的。打开不同图象错位的位置都不一样。我真不明白是怎么回事。那位帮小女子看看啊?源代码如下:
BOOL CMiniDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
CMainFrame* pMainFrm = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
//pImageFileMemDC = pMainFrm->pScrnImageMemDC;
pMainFrm->SetProceedText("打开一幅图像");
CFile ImageFile;
CFileException fe;
if( !ImageFile.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWrite, &fe) ){
ReportSaveLoadException(lpszPathName, &fe, FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
return FALSE;
}
DeleteContents();
// 尝试调用ReadDIBFile()读取图像
TRY
{
m_hDIB = ::ReadDIBFile(ImageFile);
}
CATCH (CFileException, eLoad)
{
// 读取失败
ImageFile.Abort();
// 恢复光标形状
EndWaitCursor();
// 报告失败
ReportSaveLoadException(lpszPathName, eLoad,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
// 设置DIB为空
m_hDIB = NULL;
// 返回FALSE
return FALSE;
}
END_CATCH
// 初始化DIB
InitDIBData();
// 恢复光标形状
EndWaitCursor();
// 判断读取文件是否成功
if (m_hDIB == NULL)
{
// 失败,可能非BMP格式
CString strMsg;
strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
// 提示出错
MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
// 返回FALSE
return FALSE;
}
SetPathName(lpszPathName);
SetModifiedFlag(FALSE);
m_bOpenFile=TRUE;
return TRUE;
}
HDIB WINAPI ReadDIBFile(CFile& file)
{
BITMAPFILEHEADER bmfHeader;
DWORD dwBitsSize;
HDIB hDIB;
LPSTR pDIB;
// 获取DIB长度
dwBitsSize = file.GetLength();
// 尝试读取DIB文件头
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
{
// 大小不对,返回NULL。
return NULL;
}
// 判断是否是DIB对象,检查头两个字节是否是"BM"
if (bmfHeader.bfType != 19778)//DIB_HEADER_MARKER)
{
// 非DIB对象,返回NULL。
return NULL;
}
// 为DIB分配内存
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,\
dwBitsSize-sizeof(BITMAPFILEHEADER));
if (hDIB == 0)
{
// 内存分配失败,返回NULL。
return NULL;
}
// 锁定
pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
// 读象素
if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
dwBitsSize - sizeof(BITMAPFILEHEADER) )
{
// 大小不对。
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
// 释放内存
::GlobalFree((HGLOBAL) hDIB);
// 返回NULL。
return NULL;
}
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
// 返回DIB句柄
return hDIB;
}
ReadDIBFile()函数只是将DIB文件中的除了BITMAPFILEHEADER结构之外的其他所有部分读入hDIB指向的内存.要想正确显示DIB还需要得到文件信息头结构(BITMAPINFOHEADER),调色板(RGBQUAD)DIB的数据区指针.有了这些,才能正确显示DIB.
CFile Imagefile 打开时应当用CFile::typeBinary 打开.否则CFile 会作错误
的换行解释.