Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1348 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Buffer image et MFC

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Buffer image et MFC

n°1320753
katmayes
Posté le 08-03-2006 à 10:13:27  profilanswer
 

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

mood
Publicité
Posté le 08-03-2006 à 10:13:27  profilanswer
 

n°1320835
straffo
Posté le 08-03-2006 à 11:55:01  profilanswer
 

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
n°1321675
katmayes
Posté le 09-03-2006 à 11:41:32  profilanswer
 

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

n°1321958
straffo
Posté le 09-03-2006 à 16:19:15  profilanswer
 

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.

n°1322510
katmayes
Posté le 10-03-2006 à 09:47:43  profilanswer
 

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. }


 

n°1322511
katmayes
Posté le 10-03-2006 à 09:49:14  profilanswer
 

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

n°1322862
straffo
Posté le 10-03-2006 à 16:00:07  profilanswer
 

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
n°1322974
katmayes
Posté le 10-03-2006 à 17:16:04  profilanswer
 

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é

n°1322987
katmayes
Posté le 10-03-2006 à 17:30:56  profilanswer
 

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. }

n°1323010
katmayes
Posté le 10-03-2006 à 18:10:42  profilanswer
 

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
mood
Publicité
Posté le 10-03-2006 à 18:10:42  profilanswer
 

n°1323980
straffo
Posté le 13-03-2006 à 09:42:40  profilanswer
 

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
n°1326545
katmayes
Posté le 16-03-2006 à 11:15:14  profilanswer
 

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:  
 

n°1962199
Profil sup​primé
Posté le 02-02-2010 à 09:56:50  answer
 

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]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Buffer image et MFC

 

Sujets relatifs
Espace supplémentaire sous une image avec un float?[Javascript] Problème de rafraichissement d'image
Image = lienprobleme de creation automatique d'image sur un ftp
Sélection de région d'image à l'aide la souris(Image) Possible de rendre ca compatible IE et FF?
[RESOLU] Uploader une image puis l'envoyer par mail..[RESOLU] GD : renommer une image
[resolu] cadre de sélection sur une imagecropper une image?
Plus de sujets relatifs à : Buffer image et MFC


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR