在VC中顯示和處理圖片的方法

落鶴生 發佈於 2011-10-21 09:12 點擊:344次 
來自:blog.csdn.net/mengaim_cn
幾種用GDI畫圖的方法介紹。
TAG:  GDI  
 

法1:這個方法其實用的是一本經典vc圖像處理的書上的有關讀取位圖的函數庫,php

當沒有這個函數庫時,就沒有太多的實用價值。
這種方法直接用的是讀取和顯示bmp圖片的函數庫
首先要獲得要顯示區域的位置:
  CWnd* pWnd=GetDlgItem(IDC_BMP);
  RECT rect;
  pWnd->GetClientRect(&rect);
  CDC* pDC=pWnd->GetDC();
而後調用函數庫
  //獲取DIB圖像的寬度
  int cxDIB=(int)::DIBWidth(lpDIB);
  //獲取DIB圖像的高度
  int cyDIB=(int)::DIBHeight(lpDIB);
最後也是調用函數庫
        //調用PaintDIB輸出圖像
 ::PaintDIB(pDC->m_hDC,&rect,m_hDIB,&rcDIB,NULL); 
最要釋放資源
                ReleaseDC(pDC);html


--------------------------------------------------------------------------------app

法2:
這種方法是直接在屏幕上畫圖,固然,因爲是一點一點的畫的,因此,速度會慢些。
首先要獲得要顯示區域的位置:
  CWnd* pWnd=GetDlgItem(IDC_BMP);
  CDC* pDC=pWnd->GetDC();
而後
                pDC->SetPixel(iw,ih,RGB(r,g,b));
最要釋放資源
                ReleaseDC(pDC);函數


------------------------------------------------------------------------------------學習

法3:
這種方法是在內存中開闢一個空間,而後也用SetPixel的方法往內存中寫數據,最後能夠一次性地把數據顯示在屏幕上。固然,從描述上就知道,這種方法比法2要快些,可是,因爲使用SetPixel,一個點一個點的寫數據,也會有些慢的。this

首先要獲得要顯示區域的位置:
  CWnd* pWnd=GetDlgItem(IDC_BMP);
  CDC* pDC=pWnd->GetDC();
而後
 CDC memdc;
 CBitmap m_bitmap,*m_pOldBitmap;.net

 memdc.CreateCompatibleDC(pDC);
 m_bitmap.CreateCompatibleBitmap(pDC,lWidth,lHeight);
 m_pOldBitmap=memdc.SelectObject(&m_bitmap);
而後,就能夠改變內存中的數據了
        memdc.SetPixel(iw,lHeight-ih,RGB(nrgb,nrgb,nrgb));
將結果顯示出來
 pDC->StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,
  0,0,lWidth,lHeight,SRCCOPY);
最後釋放資源
 memdc.SelectObject(m_pOldBitmap);
 m_bitmap.DeleteObject();
 ReleaseDC(pDC);htm

-----------------------------------------------------------------------------------blog

法4:
這種方法挺不錯的,必定要好好看看:)
這應該是比法2和法3都快的方法了,由於其是直接在內存中分配一個區域,直接用操做內存區域的方法去操做它,等操做完成後在一次寫到屏幕上。
首先,獲得要顯示的區域
   CWnd* pWnd=GetDlgItem(IDC_IMG);
   CDC *theDC=pWnd->GetDC();
   CRect clientRect;
   pWnd->GetClientRect(clientRect);
而後,寫頭文件
   BITMAPINFOHEADER bmiHeader;
   bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
   bmiHeader.biWidth = m_width;
   bmiHeader.biHeight = m_height;
   bmiHeader.biPlanes = 1;
   bmiHeader.biBitCount = 24;
   bmiHeader.biCompression = BI_RGB;
   bmiHeader.biSizeImage = 0;
   bmiHeader.biXPelsPerMeter = 0;
   bmiHeader.biYPelsPerMeter = 0;
   bmiHeader.biClrUsed = 0;
   bmiHeader.biClrImportant = 0;
如今就能夠顯示出圖像數據在屏幕上了
   // now blast it to the CDC passed in.
   // lines returns the number of lines actually displayed
   int lines = StretchDIBits(theDC->m_hDC,
      left, top,
      bmiHeader.biWidth,
      bmiHeader.biHeight,
      0,0,
      bmiHeader.biWidth,
      bmiHeader.biHeight,
      tmp,
      (LPBITMAPINFO)&bmiHeader,
      DIB_RGB_COLORS,
      SRCCOPY);
注意呀,其中的tmp的類型是BYTE* ,也就是說其是指向一塊內存區首地址,只要這塊內存區中放的數據是BMP位圖中的數據區的格式,就能夠了。也就是說每行元素都是32 bit(4 byte)的整數倍。圖片

有了這種方法,能夠說,能夠直接用分配內存的函數先分配一個內存區域,而後,用memcpy將一個內存中的內容複製到另外一個內存中,對其處理後,再顯示出來。

最後別忘了釋放資源
   ReleaseDC(theDC);

------------------------------------------------------------------------
另外,得到整個對話框的CDC,很差意思,不知道CDC是什麼
  CPaintDC dc(this);
  CDC *theDC=&dc;

(mengaim_cn)
 
本站文章除註明轉載外,均爲本站原創或編譯歡迎任何形式的轉載,但請務必註明出處,尊重他人勞動,同窗習共成長。轉載請註明:文章轉載自: 羅索實驗室 [ http://www.rosoo.net/a/201110/15172.html]
相關文章
相關標籤/搜索