2014-05-11 2 views
1

Je suis en train de capturer l'écran de jeu, je dois ce code:Comment sauver IDirect3DSurface9 ou LPD3DXBUFFER à la mémoire en format JPG

LPDIRECT3DDEVICE9 Device; 
D3DSURFACE_DESC screenDescription; 

... 

void Capture(){ 
    IDirect3DSurface9* pRenderTarget; 
    IDirect3DSurface9* pDestTarget; 

    Device->GetRenderTarget(0, &pRenderTarget); 
    pRenderTarget->GetDesc(&screenDescription); 

    Device->CreateOffscreenPlainSurface(screenDescription.Width, screenDescription.Height, screenDescription.Format, D3DPOOL_SYSTEMMEM, &pDestTarget, NULL); 
    Device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_FORCE_DWORD, &pDestTarget); 

    char tName[200]; 
    sprintf(tName, "%s_%d.jpg", "C:\\test", GetTickCount()); 
    D3DXSaveSurfaceToFileA(tName, D3DXIFF_JPG, pDestTarget, NULL, NULL); 

    //LPD3DXBUFFER buffer; 
    //D3DXSaveSurfaceToFileInMemory(&buffer, D3DXIFF_JPG, pDestTarget, NULL, NULL); 

    pRenderTarget->Release(); 
    pDestTarget->Release(); 

    isCapturing = false; 
} 

Enregistrement de fichier avec D3DXSaveSurfaceToFileA fonctionne parfaitement, mais je veux sauver image capturée et les écrire à la fin d'un autre fichier sur le disque, ne pas créer une nouvelle fois. Est-il possible comment convertir IDirect3DSurface9 ou LPD3DXBUFFER à JPG octets?

Répondre

2

Ok, je suis trouvé ce code et il fonctionne:

LPD3DXBUFFER buffer; 
D3DXSaveSurfaceToFileInMemory(&buffer, D3DXIFF_JPG, pDestTarget, NULL, NULL); 
DWORD imSize = buffer->GetBufferSize(); 
void* imgBuffer = buffer->GetBufferPointer(); 

std::fstream out; 
out.open(tName, std::ios_base::binary | std::ios_base::out); 
out.write((char*)imgBuffer, imSize); 
out.clear(); 
out.close(); 
Questions connexes