簡體   English   中英

無法顯示比CDC區域更高分辨率的位圖

[英]Can't Display Bitmap of Higher Resolution than CDC area

嗨,親愛的大師和專業編碼員。

我不會從新手入手,對圖像編程也不了解很多,但是不幸的是,這些是事實:(

我正在嘗試從分辨率為1392x1032的位圖指針* ImageData顯示圖像。 我試圖將其繪制在分辨率或大小為627x474的區域。

但是,反復嘗試似乎不起作用。 當我將我創建的位圖圖像從* ImageData的寬度和高度更改為分辨率或大小約為627x474時,它將起作用

在嘗試了各種論壇和Google的所有可能解決方案之后,我真的不知道如何解決此問題。

pDC是CDC *,而memDC是在較早方法中初始化的CDC。此處未初始化的所有內容都已通過其他方法初始化。

這是我的代碼親愛的謙虛大師。 請向我提供尤達和歐比旺提供給盧克·天行者的指導。

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課上

bool DemoControl :: Initialisation(CDemoTestingDlg m_FormControl,CDC m_StaticDisplay){

          pDC = m_StaticDisplay ; 
          memDC.CreateCompatibleDC(pDC); 

}

pDC和memDC在標頭中是這樣的:

CDC* pDC ; CDC memDC; 

(c)如果假設捕獲了圖像,則將圖像指針傳遞給DemoTestingDlg類,該類隨后將在Demo Control類中調用showImage方法,該方法是我在問題中編寫的方法。 我做對了嗎?

注意:如果確實說它們具有相同的大小(確實是CDC和位圖),那么它確實顯示了圖像,因此我的印象是CDC指針正確傳遞了

StretchBlt是你的朋友:)

編輯:確定如何獲得pDC? 什么時候調用函數? 表單OnPaint或DrawItem?

這是我從重寫的CStatic中的DrawItem調用中執行的StretchBlt。

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。

“來自分辨率為1392x1032的位圖指針* ImageData”

不,不是, 尺寸為 1392x1032。 分辨率是每距離的離散視覺單位的數量。

無論如何,如上所述,您需要發布更多代碼。 至少顯示OnPaint()。 您在哪里實例化CPaintDC? 新建一個項目,然后將所有代碼放入其中,以便使用最小的測試集來展示問題。 如果您使用StretchBlt()代替現在使用的BitBlt(),則您似乎處於正確的軌道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM