bonjour
je voudrais sauvegarder dans une image ce qu'il y a dans ma fenetre directX.
comme une sorte de print ecran
merci
Sylvain
bonjour
je voudrais sauvegarder dans une image ce qu'il y a dans ma fenetre directX.
comme une sorte de print ecran
merci
Sylvain
Si tu actives le multisampling il te faudra plutot récupérer le front buffer, mais ça je crois que t'en auras pas besoin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 bool Screenshot(const std::string& pFilename) { // Surface de destination LPDIRECT3DSURFACE9 Surface = NULL; // Récupération du backbuffer if (FAILED(m_Device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &Surface))) return false; // Sauvegarde de la surface dans le fichier if (FAILED(D3DXSaveSurfaceToFile(pFilename.c_str(), D3DXIFF_BMP, Surface, NULL, NULL))) { Surface->Release(); return false; } // Destruction de la surface Surface->Release(); return true; }
Moi j'utilise :
Quelle methode est la meilleure pour recuperer la surface ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 bool CUserInterface::TakeScreenShot ( ) { char Filename [ 64 ] = "Screenshot" ; time_t ltime ; time ( & ltime ) ; // Might overwrite existing files // Probability is extremely low though, so we dont care sprintf( Filename, "ScreenShot_%ld.bmp" , ltime ) ; // IDirect3DSurface9 * FrontSurface = NULL ; // Surface size must be the current desktop window size int Width = GetSystemMetrics ( SM_CXSCREEN ) ; int Height = GetSystemMetrics ( SM_CYSCREEN ) ; HRESULT hr = Game->m_pd3dDevice->CreateOffscreenPlainSurface ( Width, Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, & FrontSurface, NULL ) ; hr = Game->m_pd3dDevice->GetFrontBufferData ( 0, FrontSurface ) ; if ( FAILED( hr ) ) { SAFE_RELEASE ( FrontSurface ) ; TCHAR Msg [ ] = TEXT ( "WARNING - CUserInterface::TakeScreenShot failed.\n" ) ; CTools::Log ( Msg ) ; Game->OnCrash ( Msg ) ; return false ; } ; D3DXSaveSurfaceToFile ( Filename, D3DXIFF_BMP, FrontSurface, NULL, NULL ) ; SAFE_RELEASE ( FrontSurface ) ; return true ; }
Moi en fait j'utilise les 2 : front buffer quand je suis en fullscreen et backbuffer quand je suis en fenetré (j'ai jamais vraiment cherché a savoir pourquoi, mais en tout cas il a l'air de pas aimer quand je recupere le front buffer en fenetré).
A part l'histoire d'antialiasing, je pense que c'est kif kif (et niveau perfs on s'en fout un peu).
ahh les joies de la programmation directx. je fais de l'opengl maintenant et je trouve ca + simple.
J'avais fait une fonction qui prend des screenshot en continu si ca t'interesse sylvain_bos.
Salut a Loulou24 et LaurentUSA qui m'avaient bien aide pendant mon stage
Au début je préférais OpenGL à DirectX aussi, mais qd g vu tt ce qu'on pouvait faire avec DirectX en natif et facilement, g tt de suite retourné ma chemise !!!
Vive directX on fait tt plein d'effets en 2sec chrono, au début c compliqué je le reconnais, mais une fois ds le bain on comprend tt
c pk en fenetre quand tu recupere le front buffer tu recupere tout l'ecran et pas uniquement ta fenetre donc dx te fait une erreur comme quoi t'as pas assez de place dans la surfaceEnvoyé par Loulou24
mais donne lui la resol de ton ecran et ca marchera
j'en ai deduit que le front buffer et le buffer ecran a proprement parler
c'est ce qui sera envoye a l'ecran
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager