Sign in to follow this  
Photon Man

Screen Capture Fails

Recommended Posts

I've been working on a DirectX 9.0 (I believe DirectX 9.0a) + Windows API application (with menus, dialogs, and the like). I'm trying to capture a screen shot of either the Desktop or the Window area. I've create a basic function that stuffs a IDirect3DSurface9 with Offscreen buffer data, then I try to save the Surface to a file using DirectX's function: D3DXSaveSurfaceToFileA. Every time I try it, it seemingly works, but the picture always comes out garbled. Here is the code:
int SnapScreenShot(void)
{

IDirect3DSurface9* SnapShotBuffer = NULL;

static HRESULT Answer; 

// Designate a spot to take the shot
d3dDevice->CreateOffscreenPlainSurface(256, 256, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &SnapShotBuffer, NULL);

// Get the screen ARGB bits
Answer = d3dDevice->GetFrontBufferData(0, SnapShotBuffer);

// Calculate answers
if(Answer == D3D_OK)
MessageBox(NULL, "Front Buffer was stored!", "", MB_OK);

if(Answer == D3DERR_DEVICELOST)
MessageBox(NULL, "Front Buffer was not stored!", "", MB_OK);

if(Answer == D3DERR_INVALIDCALL)
MessageBox(NULL, "Front Buffer was not stored! D3DERR_INVALIDCALL", "", MB_OK);

			
  
	// If all is well - Save the data out
	if(D3DXSaveSurfaceToFile("Screenshot0001.bmp", D3DXIFF_BMP, 
           SnapShotBuffer, NULL, NULL)  == D3D_OK)
	                                                          

	   MessageBox(NULL, "Screen shot saved!", "Good report", MB_OK);

	else

	   MessageBox(NULL, "Screen shot failed to save...", "ERROR", MB_OK);
		
		
        // Release after we are done using it.
	SnapShotBuffer->Release();

        // return OK
	return 1;
}
I'm also doing this in "windowed mode". I tried changing the code around, but I couldn't get the picture to save un-garbled. Thanks Guys for the HELP!

Share this post


Link to post
Share on other sites
I'm not sure about this, but any time I use my snapshot function it had to be prior to calling present on the backbuffer (I'm not sure where you call the function, so it may or may not be the case for you...).

Just for a reference, here's my function that records the back buffer (as opposed to your front buffer version):

//--------------------------------------------------------------------------------
void CRendererDX9::SaveScreenShot( std::string& filename )
{
static int iScreenNum = 100000;

iScreenNum++;

std::stringstream out;
out << iScreenNum;

IDirect3DSurface9* BackBuffer = NULL;
m_pDevice->GetRenderTarget(0, &BackBuffer);

std::string name = out.str();
name = filename + name + std::string(".bmp"); //out.str() +

D3DXSaveSurfaceToFile( name.c_str(), D3DXIFF_BMP, BackBuffer, NULL, NULL );

if (BackBuffer != NULL)
BackBuffer->Release();
}
//--------------------------------------------------------------------------------

Share this post


Link to post
Share on other sites
Hey Thanks!!!

I would have never thought of that, because of "Microsoft's misleading" help files. Follow the link to see what I mean.

Microsoft Website Library

Look at the "Remarks" on the bottom that read:

This method is the only way to capture an antialiased screen shot.

What type of misinformation is that!
but anyway, Thanks Again Jason!

Share this post


Link to post
Share on other sites
Quote:
Original post by Photon Man
Hey Thanks!!!

I would have never thought of that, because of "Microsoft's misleading" help files. Follow the link to see what I mean.

Microsoft Website Library

Look at the "Remarks" on the bottom that read:

This method is the only way to capture an antialiased screen shot.

What type of misinformation is that!
but anyway, Thanks Again Jason!
That's because if your backbuffer is antialiased, you won't be able to use that method, and you'll have to use GetFrontBufferData.

Share this post


Link to post
Share on other sites
Thanks Steve for shining some light back on microsoft...

The snapshot backbuffer code did the trick for me, except now you've increased my pondering on how you'd use the GetFrontBufferData function. Does anyone have a miracle?

I've read some of your replies to other posts, Steve, and you've helped me A lot, so Thanks!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this