当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: 视频点播怎么作啊???用real服务器的。。。谢谢 ......
    摘要: 请会做的解答。在线。 ......


打开图象的问题

问题是这样的:我现在打开一幅图象进行处理,我用的是邮电的《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;  
  }

NO.1   作者: sealaugh1980

ReadDIBFile()函数只是将DIB文件中的除了BITMAPFILEHEADER结构之外的其他所有部分读入hDIB指向的内存.要想正确显示DIB还需要得到文件信息头结构(BITMAPINFOHEADER),调色板(RGBQUAD)DIB的数据区指针.有了这些,才能正确显示DIB.

NO.2   作者: cntiger

CFile   Imagefile   打开时应当用CFile::typeBinary   打开.否则CFile   会作错误  
  的换行解释.


 ·人民帮人民一把(之六)    »显示摘要«
    摘要: 请问各位仁兄,q1:怎么能做出像vc编译器中的放置节点的那个灰色的竖条? q2:怎么我加的haha类继承的clistview,编译器告诉我clistview没定义啊?! 可怎么定义呢? ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE