Domanda

Ciao cari guru e programmatori esperti.

Non sto andando iniziare con im un principiante e non so molto circa la programmazione delle immagini, ma purtroppo questi sono i fatti: (

Sto cercando di visualizzare un'immagine da un puntatore bitmap * ImageData che è di risoluzione 1392x1032. Sto cercando di disegnare che ad una superficie di risoluzione o le dimensioni 627x474.

Tuttavia, ripetuto doesnt cercando sembra funzionare. Funziona quando cambio l'immagine bitmap che ho creato dalla larghezza e l'altezza * ImageData alla risoluzione o le dimensioni di circa 627x474

Io davvero non so come risolvere questo dopo aver provato tutte le soluzioni possibili da vari forum e google.

PDC è un CDC * e memDC è un CDC inizializzato in un metodo precedente Tutto ciò non inizializzati qui è stato inizializzato in altri metodi.

Ecco il mio codice cari guru umili. Non mi fornisce indicazioni di guida Yoda e Obi-Wan forniti a 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);

}

Ecco Ok alcune parti aggiuntive

penso che dovrei spiegare come il flusso va.

(a) Una classe (diciamo DemoTestingDlg classe) passerà il CDC, come di seguito per un'altra classe (diciamo classe DemoControl)

m_Demo = new DemoControl ; 

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

(b) Alla classe DemoControl

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

          pDC = m_StaticDisplay ; 
          memDC.CreateCompatibleDC(pDC); 

}

PDC e memDC è come tale nell'intestazione:

CDC* pDC ; CDC memDC; 

(c) Se diciamo l'immagine viene catturata, l'immagine puntatore viene passato alla classe DemoTestingDlg che sarà successivamente chiamare un metodo ShowImage nella classe Control Demo che è il metodo che ho scritto nella domanda. Sto facendo la cosa giusta?

Nota: Si ha mostrato un'immagine se permette di dire che sono della stessa dimensione (da cui intendo il CDC e bitmap) così ho avuto l'impressione che il mio puntatore del CDC è stata approvata correttamente

È stato utile?

Soluzione

StretchBlt è tuo amico :)

Edit: OK Come si ottiene pDC? Quando si chiama la funzione? Modulo OnPaint o DrawItem?

Questa è una StretchBlt faccio da una chiamata DrawItem in un CStatic sovresposta.

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

La sua non utilizzando le classi MFC di allungare un 4x4 bitmap in uno spazio più grande, ma funziona perfettamente. La mia ipotesi è che non si sta facendo in risposta ad una WM_PAINT / WM_DRAWITEM e / o utilizza il DC sbagliata.

Modifica re la tua modifica: Ti quindi chiamare DrawImage da dentro una chiamata OnPaint o DrawItem?

avrei pensato che si sta meglio non cacheing che CDC e passando il CDC in ogni volta che si desidera disegnare.

Altri suggerimenti

"da un puntatore bitmap * ImageData che è di risoluzione 1392x1032"

No, non è, è di size 1392x1032. La risoluzione è la quantità di unità visive discreti per distanza.

In ogni caso, come è stato menzionato in precedenza, è necessario inviare più codice. Mostra almeno OnPaint (). Dove stai istanziare la CPaintDC? Fare un nuovo progetto e mettere tutto il codice in là, in modo da avere un set di prova minimo che presenta il problema. Ti sembra di essere più o meno sulla strada giusta, se si utilizza StretchBlt () al posto del BitBlt () si sta utilizzando ora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top