2010-05-14 76 views
2

嗨,親愛的大師和專家編碼人員。無法顯示比CDC區域更高分辨率的位圖

我是不是要開始與我是個新手,不知道很多關於圖像編程可惜這些都是事實:(

我試圖顯示從位圖指針*的ImageData是一個圖像分辨率爲 1392x1032。我試圖在分辨率或尺寸627x474的區域繪製。

然而,重複嘗試似乎沒有工作。它工作時,我更改位圖圖像我創建從* ImageData寬度和高度分辨率或大小約627x474

我真的不知道h在嘗試從各種論壇和谷歌的所有可能的解決方案後解決這個問題。

pDC是CDC *,而memDC是在早期方法中初始化的CDC 此處未初始化的任何內容都是在其他方法中初始化的。

這是我的代碼親愛的謙卑的大師。請向我提供Yoda和Obi-Wan向Luke Skywalker提供的指導。

void DemoControl::ShowImage(void *ImageData) 
{ 


    int Width; //Width of Image From Camera 
    int Height; //Height of Image From Camera 

    int m_DisplayWidth = 627 ;//width of rectangle area to display 
    int m_DisplayHeight = 474;//height of rectangle area to display 

    GetImageSize(&Width, &Height) ; //this will return Width = 1392, Height 1032 

    CBitmap bitmap; 

    bitmap.CreateBitmap(Width,Height,32,1,ImageData); 

    CBitmap* pOldBitmap = memDC.SelectObject((CBitmap*)&bitmap); 

    pDC->BitBlt(22, 24, 627, 474, &memDC, 0, 0, SRCCOPY); 

    memDC.SelectObject((CBitmap*)pOldBitmap); 

    ReleaseDC(pDC); 

} 

確定繼承人一些額外的零件

我想我應該解釋流程如何。

(a)在類(可以說DemoTestingDlg類)將通過CDC如下到另一個類(可以說DemoControl類)

m_Demo = new DemoControl ; 

m_Demo->Initialisation(this, this->GetDC()) ; 

(b)在DemoControl類

布爾DemoControl ::初始化(CDemoTestingDlg m_FormControl,CDC m_StaticDisplay){

  pDC = m_StaticDisplay ; 
      memDC.CreateCompatibleDC(pDC); 

}

的pDC和memDC是這樣在標題:

CDC* pDC ; CDC memDC; 

(c)如果讓說的圖像被捕獲,圖像指針傳遞給DemoTestingDlg類隨後將調用一個showImage方法在演示控制類是我在問題中寫的方法。我做對了嗎?

注:這確實顯示的圖像,如果可以說它們是相同的尺寸(通過他們我的意思是CDC和位圖),所以我認爲我的CDC指針被正確地傳遞

回答

1

StretchBlt下的印象是你的朋友:)

編輯:好的你如何得到pDC?你的函數何時被調用?形式OnPaint或DrawItem?

這是一個StretchBlt我從一個覆蓋CStatic中的DrawItem調用。

HDC hBitmapDC = CreateCompatibleDC(pDrawItemStruct->hDC); 

HBITMAP hBitmap = GetBitmap(); 
HGDIOBJ hOld = SelectObject(hBitmapDC, (HGDIOBJ)hBitmap); 

StretchBlt(pDrawItemStruct->hDC, pDrawItemStruct->rcItem.left, pDrawItemStruct->rcItem.top, pDrawItemStruct->rcItem.right, pDrawItemStruct->rcItem.bottom, 
      hBitmapDC, 0, 0, 4, 4, SRCCOPY); 

SelectObject(hBitmapDC, hOld); 
DeleteObject(hBitmapDC); 

它不使用MFC類將4x4位圖拉伸到更大的空間,但完美地工作。我的猜測是,你不是在響應WM_PAINT/WM_DRAWITEM和/或使用錯誤的DC。

編輯重新您的編輯:你再從一個OnPaint或DRAWITEM調用內部調用的DrawImage?

我還以爲你是關閉該CDC和傳遞CDC每次在你想畫它不cacheing更好。

+0

試過了StretchBlt,但同樣的效果太不幸了:( – 2010-05-14 09:31:11

+0

好吧,或者我誤解了你的問題,或者你做了StretchBlt的一些錯誤,StretchBlt會渲染一個1392x1032的圖像到627x424 DC ...你有什麼錯誤?我看到你試過的StretchBlt調用了嗎? – Goz 2010-05-14 09:36:57

+0

pDC-> StretchBlt(22,24,627,474,&memDC,0,0,Width,Height,SRCCOPY); 它不顯示錯誤,比如bitblt,都沒有返回給我圖像當我把圖像的寬度和高度設置爲「寬度」和「高度」(參考上面的值)時,只有當我把寬度和高度與CDC區域627x474相同時才顯示圖像 – 2010-05-14 09:40:15

0

「從位圖指針*的ImageData是分辨率1392x1032的」

不,它不是,它是大小 1392x1032的。分辨率是每個距離的離散視覺單位的數量。

無論如何,如上所述,您需要發佈更多的代碼。至少顯示OnPaint()。你在哪裏實例化CPaintDC?製作一個新項目並將所有代碼放在那裏,這樣你就有了一個最小的測試集來展示問題。如果您使用StretchBlt()代替您現在使用的BitBlt(),則您似乎大致在正確的軌道上。