VisualC 6.0开发灰度位图处理(2)

2008-04-09 04:08:44来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

存储时位图所有像素所占的总字节数
  dwDIBSize = dwBmBitsSize;
  lpBI->biSizeImage = dwBmBitsSize; // 位图所有像素所占的总字节数
  file://以下五句为文件头结构填充值
  bmfHdr.bfType =0x4d42; // 文件为"BMP"类型
  bmfHdr.bfSize = dwDIBSize sizeof(BITMAPFILEHEADER);//文件总长度
  bmfHdr.bfReserved1 = 0;
  bmfHdr.bfReserved2 = 0;
  bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) lpBI->biSize
             256*sizeof(RGBQUAD);
  file://位图数据距问件头的偏移量
  file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));//写文件头
  file.WriteHuge(lpBI, dwDIBSize);
  file://将位图信息(信息头结构、颜色表、像素数据)写入文件
  ::GlobalUnlock((HGLOBAL) m_hDIB);
  EndWaitCursor();
  SetModifiedFlag(FALSE); // back to unmodified
  return TRUE;
 }

  二、 调色板的操作

  灰度图像要正确显示,必须实现逻辑调色板和系统调色板 ,通过在主框架类中处理Windows定义的消息WM_QUERYNEWPALETTE 、WM_PALETTECHANGED及视图类中处理自定义消息WM_DOREALIZE(该消息在主框架窗口定义如下:#define WM_REALIZEPAL (WM_USER 100))来实现调色板的操作。

void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd)
{ file://总实现活动视的调色板
 CMDIFrameWnd::OnPaletteChanged(pFocusWnd);
 CMDIChildWnd* pMDIChildWnd = MDIGetActive();
 if (pMDIChildWnd == NULL)
  return
  CView* pView = pMDIChildWnd->GetActiveView();
  ASSERT(pView != NULL);
  SendMessageToDescendants(WM_DOREALIZE, (WPARAM)pView->m_hWnd);
  file://通知所有子窗口系统调色板已改变
 }
BOOL CMainFrame::OnQueryNewPalette()//提供实现系统调色板的机会
 {
  // 实现活动视的调色板
  CMDIChildWnd* pMDIChildWnd = MDIGetActive();
  if (pMDIChildWnd == NULL)
   return FALSE; // no active MDI child frame (no new palette)
   CView* pView = pMDIChildWnd->GetActiveView();
   ASSERT(pView != NULL);
   file://通知活动视图实现系统调色板
   pView->SendMessage(WM_DOREALIZE, (WPARAM)pView->m_hWnd);
   return TRUE;
 }
 LRESULT CDibView::OnDoRealize(WPARAM wParam, LPARAM)//实现系统调色板
 {
  ASSERT(wParam != NULL);
  CDibDoc* pDoc = GetDocument();
  if (pDoc->m_hDIB == NULL)
   return 0L; // must be a new document
   CPalette* pPal = pDoc->m_palDIB;
   file://调色板的颜色表数据在InitDIBData()函数中实现
   if (pPal != NULL)
   {
    CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
    ASSERT_KINDOF(CMainFrame, pAppFrame);
    CClientDC appDC(pAppFrame);
    CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd);
    file://只有活动视才可以设为"FALSE",
    // 即根据活动视的调色板设为"前景"调色板
    if (oldPalette != NULL)
    {
     UINT nColorsChanged = appDC.RealizePalette();//实现系统调色板
     if (nColorsChanged > 0)
      pDoc->UpdateAllViews(NULL);//更新视图
      appDC.SelectPalette(oldPalette, TRUE);
      file://将原系统调色板置为逻辑调色板
     }
    else
    {
     TRACE0("\tSelectPalette failed in
          CDibView::OnPaletteChanged\n");
     }
    }

  注:在调用API函数显示位图时,不要忘记设置逻辑调色板,即"背景"调色板,否则位图将无法正确显示。

  三、图像的数字化处理

  通过以上读文件的操作,已经得到图像数据,由于得到的数据包括多余信息,所以在进行数字图像处理时要进一步删除多余信息,只对位图的像素进行操作,以基于模板的高通滤波为例来讲述数字图像处理的实现 :

void CDibView::OnMENUHighPass()
{ HANDLE data1handle;
 LPBITMAPINFOHEADER lpBi;
 CDibDoc *pDoc=GetDocument();
 HDIB hdib; unsigned char *hData; unsigned char *data;
 hdib=pDoc->GetHDIB();
 BeginWaitCursor();
 lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
 hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
 pDoc->SetModifiedFlag(TRUE);
 data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:初识VisualC .NET开发环境

下一篇:利用VisualC 实现AVI文件的图像截取

IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设

网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源

网站联盟: 联盟新闻 联盟介绍 联盟点评 网赚技巧

行业资讯: 搜索引擎 网络游戏 电子商务 广告传媒

网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它

服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护

软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷

网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash

程序设计: Java技术 C/C++ VB delphi

网络知识: 网络协议 网络安全 网络管理 组网方案 Cisco技术

操作系统: Win2000 WinXP Win2003 Mac OS Linux FreeBSD

热门词条
最新资讯
热门关注
热门标签