法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)
|