Question

Salut à tous gourous chers et experts codeurs.

Je ne vais pas commencer par im un débutant et je ne sais pas beaucoup sur la programmation d'images, mais malheureusement ce sont les faits: (

Je suis en train d'afficher une image à partir d'un pointeur bitmap * ImageData qui est de la résolution 1392x1032. Je suis en train de tirer cette dans une zone de la résolution ou la taille 627x474.

Cependant, répété ne marche pas essayer semblent fonctionner. Il fonctionne lorsque je change l'image bitmap I créé à partir de la largeur et de la hauteur * ImageData à la résolution ou la taille de l'ordre de 627x474

Je ne sais vraiment pas comment résoudre ce après avoir essayé toutes les solutions possibles à partir de divers forums et Google.

pDC est un CDC * et memDC est un CDC initialisé dans un procédé antérieur Tout ce qui a été initialisé ici non initialisé dans d'autres méthodes.

Voici mon code chers gourous humbles. Ne me fournir des conseils Yoda et Obi-Wan fourni à 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);

}

Ok Heres quelques pièces supplémentaires

Je pense que je devrais expliquer comment le flux va.

(a) Une classe (permet de dire que la classe DemoTestingDlg) passera la CDC comme ci-dessous à une autre classe (classe permet de dire DemoControl)

m_Demo = new DemoControl ; 

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

(b) à la classe DemoControl

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

          pDC = m_StaticDisplay ; 
          memDC.CreateCompatibleDC(pDC); 

}

pDC et memDC est en tant que tel dans l'en-tête:

CDC* pDC ; CDC memDC; 

(c) Si permet de dire une image est capturée, le pointeur d'image est transmise à la classe DemoTestingDlg qui sera ensuite appeler une méthode showImage dans la classe de démonstration de contrôle qui est la méthode que j'ai écrit dans la question. Est-ce que je fais bien?

Note: Il a fait montrer une image si laisse dire qu'ils sont de la même taille (par elles que je veux dire la CDC et bitmap) donc j'avais l'impression que mon pointeur CDC a été transmis correctement

Était-ce utile?

La solution

StretchBlt est votre ami :)

Edit: OK, comment obtenez-vous pDC? Quand est votre fonction appelée? Formulaire OnPaint ou DrawItem?

Ceci est un StretchBlt que je fais d'un appel DrawItem dans une CStatic surchargée.

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

Son ne pas utiliser les classes MFC pour étirer une image bitmap 4x4 dans un plus grand espace, mais fonctionne parfaitement. Je suppose que vous ne le faites pas en réponse à une WM_PAINT / WM_DRAWITEM et / ou utilisez la mauvaise DC.

Modifier à nouveau votre édition: Est-ce que vous appelez ensuite DrawImage à l'intérieur d'un appel OnPaint ou DrawItem?

J'aurais pensé que vous mieux ne pas que CDC et un cache en passant la CDC chaque fois que vous souhaitez dessiner.

Autres conseils

"à partir d'un pointeur de bitmap * ImageData qui est de la résolution 1392x1032"

Non, ce n'est pas, il est de Taille 1392x1032. La résolution est la quantité d'unités visuelles discrètes par la distance.

Quoi qu'il en soit comme cela a été mentionné ci-dessus, vous devez poster plus de code. Afficher au moins OnPaint (). Où êtes-vous instanciez CPaintDC? Faire un nouveau projet et mettre tout votre code là-dedans, de sorte que vous avez un ensemble de test minimal qui présente le problème. Vous semblez être à peu près sur la bonne voie, si vous utilisez StretchBlt () à la place du BitBlt () que vous utilisez maintenant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top