Buffer image et MFC

Buffer image et MFC - C++ - Programmation

Marsh Posté le 08-03-2006 à 10:13:27    

Bonjour,
 
 
je désespère depuis 1 semaine et demi car je n'arrive pas à trouver de solutions à mon problème...
En fait pour simplifier les choses j'obtiens une image de type bmp depuis mon framegrabber (jusque la tout va bien... j'ai vérifié que l'image était bonne...et c'est le cas)...tout ça est stocké dans un variable pointeur  imgBuff.
A présent avec MFC j'ai créé un contrôle CStatic Picture IDC_VIDEONOTMODIFED de type Bitmap ou je voudrais afficher chaques images qui est contenue dans imgBuff...
Je peux pas utiliser de Handle pour faire ça car il faut impérativement que je puisse traiter chaques images avant de les afficher...
 
Alors à votre bon coeur parce que je n'en puis plus  :pt1cable:    :lol:  
 
                                                                          merci par avance  :)

Reply

Marsh Posté le 08-03-2006 à 10:13:27   

Reply

Marsh Posté le 08-03-2006 à 11:55:01    

De mémoire tu crée un CBitmap a partir de ton buffer ( cherche CreateBitmap dans la doc) et tu devrais pouvoir récupérer un HBITMAP et utiliser la fct SetBitmap de ton CStatic.
 
Il faut sans doute que ton CStatic soit de style SS_BITMAP.
 
Fred


Message édité par straffo le 08-03-2006 à 11:58:05
Reply

Marsh Posté le 09-03-2006 à 11:41:32    

euh ben pour le CreateBitmap on est ok... mais après je comprend pas vraiment le truc avec CStatic et SS_BITMAP ???

Reply

Marsh Posté le 09-03-2006 à 16:19:15    

le plus simple serais que tu lise :
 
http://www.codeproject.com/staticc [...] rl_tut.asp
 
ou
 
http://c.developpez.com/faq/vc/?pa [...] tmapInCtrl
 
 
Je suppose que tu as crée ton CStatic de type picture avec l'éditeur de ressources ?
Si oui tu regarde ses propriétés (click droit properties) et dans le premier onglet de config dans la combo type tu choisis Bitmap.
 
La j'ai pas le temps,je ferais peut-être un example demain.

Reply

Marsh Posté le 10-03-2006 à 09:47:43    

Hello...
 
ben j'ai pondu quelque chose en prennant des choses par ci par la... mais ca ne m'affiche tjr rien:
 

Code :
  1. void CFastFace_InterfaceDlg::OnInitializeCam()
  2. {
  3. Falconscr = new FalconSource(BOARD_NUMBER,INPUT,IMG_WIDTH,IMG_HEIGHT);
  4. Cbmp_frame= new CBitmap();
  5. CDC_Mem = new CDC();
  6. m_Picture = new CPicture();
  7. m_VideoNotModifiedDC=m_VideoNotModified.GetDC();
  8. CDC_Mem->CreateCompatibleDC(m_VideoNotModifiedDC);
  9. }
  10. #define DELETE_OBJ(oBJ) {if(oBJ!=NULL){delete oBJ; oBJ = NULL;}}
  11. void CFastFace_InterfaceDlg::OnStartCapture()
  12. {
  13. while (NoStop)
  14. {
  15.  imgBuffer=(unsigned char*)malloc(Falconscr->GetHeight()*Falconscr->GetWidth()*3*sizeof(char));
  16.  Falconscr->Capture();
  17.  Falconscr->GetImage(&imgBuffer);
  18.  Falconscr->PumpMessages();
  19.  //l'image ici est sauvegardé dans toto.bmp... jusque la ca marche
  20.                  is_SaveImageMem(Falconscr->Gethandle(), "C:\\toto.bmp",(char*)imgBuffer,0);
  21.                 //a partir de la... rien ne s'affiche dans mon contrôle picture
  22.  Cbmp_frame->CreateBitmap(Falconscr->GetWidth(),Falconscr->GetHeight(),1,3,imgBuffer);
  23.  CBitmap* pOldBitmap = CDC_Mem->SelectObject(Cbmp_frame);
  24.  m_VideoNotModifiedDC->BitBlt(0,0,Falconscr->GetWidth(),Falconscr->GetHeight(),CDC_Mem,0,0,SRCCOPY);
  25.  Cbmp_frame->DeleteObject();
  26.  free(imgBuffer);
  27. }
  28. }


 

Reply

Marsh Posté le 10-03-2006 à 09:49:14    

je précise tout de même que mon contrôle picture à bien été mis sur BITMAP dans les propriétés..et ça depuis le début...je lui ai attribué un nom avec le class Wizard  m_VideoNotModified

Reply

Marsh Posté le 10-03-2006 à 16:00:07    

Pour l'instant j'ai le même pb que toi ... il faut que je regarde dans mes archives :)
 
 
grrr le pb est que l'image est 24 bit ... en 256 ça marche ...
 


Message édité par straffo le 10-03-2006 à 16:17:23
Reply

Marsh Posté le 10-03-2006 à 17:16:04    

ouf lol...je me disais que j'étais devenu totalement inculte en programmation  :cry: :)
Alors j'attend de tes news  :bounce:  je continue a chercher de mon côté

Reply

Marsh Posté le 10-03-2006 à 17:30:56    

J'ai fais quelques modifs dans mon code... il n'y a plus d'erreur.. mais par contre l'image ne s'affiche tjr pas :??:  
 
 

Code :
  1. void CFastFace_InterfaceDlg::OnInitializeCam()
  2. {
  3. Falconscr = new FalconSource(BOARD_NUMBER,INPUT,IMG_WIDTH,IMG_HEIGHT);
  4. imgBuffer=(unsigned char*)malloc(Falconscr->GetHeight()*Falconscr->GetWidth()*3*sizeof(char));
  5. imgTest=(unsigned char*)malloc(Falconscr->GetHeight()*Falconscr->GetWidth()*3*sizeof(char));
  6. }
  7. #define DELETE_OBJ(oBJ) {if(oBJ!=NULL){delete oBJ; oBJ = NULL;}}
  8. void CFastFace_InterfaceDlg::OnStartCapture()
  9. {
  10. while (NoStop)
  11. {
  12.  CDC_Mem = new CDC();
  13.  m_VideoNotModifiedDC=m_VideoNotModified.GetDC();       
  14.  Cbmp_frame= new CBitmap();
  15.  Falconscr->Capture(m_hWndNotModified);
  16.  Falconscr->GetImage(&imgBuffer);
  17.  Falconscr->PumpMessages();
  18.  Cbmp_frame->CreateBitmap(Falconscr->GetWidth(),Falconscr->GetHeight(),1,3,imgBuffer);
  19.  Cbmp_frame->GetBitmapBits(sizeof(imgBuffer),imgTest);
  20.  is_SaveImageMem(Falconscr->Gethandle(), "C:\\toto.bmp",(char*)imgTest,0);
  21.  if(m_VideoNotModifiedDC!=NULL)
  22.  {
  23.   CDC_Mem->CreateCompatibleDC(m_VideoNotModifiedDC);
  24.  }
  25.  m_VideoNotModifiedDC->BitBlt(0,0,Falconscr->GetWidth(),Falconscr->GetHeight(),CDC_Mem,0,0,SRCCOPY);
  26.  DELETE_OBJ(Cbmp_frame);
  27.  DELETE_OBJ(CDC_Mem);
  28. }
  29. free(imgBuffer);
  30. }
  31. void CFastFace_InterfaceDlg::OnStopCapture()
  32. {
  33. NoStop=FALSE;
  34. m_VideoNotModified.ReleaseDC(m_VideoNotModifiedDC);
  35. }
  36. #define DELETE_OBJ(oBJ) {if(oBJ!=NULL){delete oBJ; oBJ = NULL;}}
  37. void CFastFace_InterfaceDlg::OnCancel()
  38. {
  39. DELETE_OBJ(Falconscr);
  40. DELETE_OBJ(Cbmp_frame);
  41. DELETE_OBJ(CDC_Mem);
  42. CDialog::OnCancel();
  43. }

Reply

Marsh Posté le 10-03-2006 à 18:10:42    

ah oui lol..oubliez qqch pour que ca fonctionne normalement (mais ca fonctionne tjr pas :(  
 

Code :
  1. if(m_VideoNotModifiedDC!=NULL)
  2.  {
  3.   CDC_Mem->CreateCompatibleDC(m_VideoNotModifiedDC);
  4.   pOldBitmap = CDC_Mem->SelectObject(Cbmp_frame);
  5.   //Cbmp_frame->GetBitmapBits(sizeof(imgBuffer),imgTest);
  6.   //is_SaveImageMem(Falconscr->Gethandle(), "C:\\toto.bmp",(char*)imgTest,0);
  7.   m_VideoNotModifiedDC->BitBlt(0,0,Falconscr->GetWidth(),Falconscr->GetHeight(),CDC_Mem,0,0,SRCCOPY);
  8.  }


 
dans le if il faut mettre ca... par contre j'ai remarqué que pOldBitmap ne recevait pas l'image Bitmap souhaité...


Message édité par katmayes le 10-03-2006 à 18:18:35
Reply

Marsh Posté le 10-03-2006 à 18:10:42   

Reply

Marsh Posté le 13-03-2006 à 09:42:40    

question à la con avec to frame grabber tu n'as pas de controle pour l'affichage ?
 
J'ai bossé avec du matos Cognex et on avait des controles pour ça ...
un petit truc fait à l'arrache :
 
http://www.onpoi.net/ah/pics/users [...] mpdisp.zip


Message édité par straffo le 13-03-2006 à 10:24:03
Reply

Marsh Posté le 16-03-2006 à 11:15:14    

Hello,
 
en fait j'ai tout repris à zéro ... et mnt ca marche.. je suis passé par autre chose...
Pour ceux que sa intéresse voici le code :
 
avec pStatic le pointeur sur la picture Controle et pour le reste c'est assez explicite :)
PumpMessage sert uniquement à rattraper l'arret de la capture dans la boucle while ou j'implante cette fonction:
 

Code :
  1. void DisplayImage( CStatic *pStatic,
  2.     int imgHeight,
  3.     int imgWidth,
  4.     BYTE *img
  5.    )
  6. {
  7. CDC tmpDC;
  8. CBitmap cFrame;
  9. int imgArea=imgHeight*imgWidth;
  10. if (pStatic!=NULL)
  11.  {
  12.   CDC *pDC=pStatic->GetDC();
  13.   //To convert from 24 to 32 bits
  14.   unsigned int  * image32 = new unsigned int[4*imgArea];
  15.   unsigned char * pImg = img;
  16.   for (int i=0; i<imgArea; i++)
  17.   {
  18.    image32[i] = RGB(pImg[0],pImg[1],pImg[2]);
  19.    pImg+=3;
  20.   }
  21.   //Create a compatible environnement
  22.   tmpDC.CreateCompatibleDC(pDC);
  23.   cFrame.CreateCompatibleBitmap( pDC,
  24.            imgWidth,
  25.            imgHeight);
  26.   //Copy the image to the compatible environnement
  27.   cFrame.SetBitmapBits( 4*imgArea,
  28.          (unsigned char*)image32);
  29.   pStatic->SetBitmap(HBITMAP(cFrame));
  30.   //To Get the Stop message  
  31.   PumpMessages();
  32.   //Delete on memory
  33.   DeleteObject(tmpDC);
  34.   DeleteObject(pDC);
  35.   DeleteObject(cFrame);
  36.   delete [] image32;
  37.   pStatic->ReleaseDC(pDC);
  38.  }
  39. }
  40. void PumpMessages()
  41. {
  42.    // Handle dialog messages  
  43.     MSG msg;
  44.     while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  45.     {
  46.         if (!AfxGetApp()->PreTranslateMessage(&msg))
  47.       {
  48.          ::TranslateMessage(&msg);
  49.          ::DispatchMessage(&msg);
  50.      }           
  51.      AfxGetApp()->OnIdle(0);   // updates user interface  
  52.     AfxGetApp()->OnIdle(1);   // frees temporary objects  
  53.     }
  54. }


 
Donc voila si ca peut aider des gens qui aurait pété les plombs pendant un moment la-dessus.. là c'est du tout cuit :)
 
Enjoy et merci à toi Straffo pour ton aide :)  :bounce:  
 

Reply

Marsh Posté le 02-02-2010 à 09:56:50    

J'up ce vieux topic en guise de remerciement, je viens de me servir du bout de code juste au dessus et ca marche [:blair witch]  
Juste une question au cas ou, sauf erreur tmpDC n'est pas utilisé ?  [:blinkgt]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed