C++ Auf LPD3DXBUFFER zugreifen

donpsycho

Cadet 2nd Year
Registriert
Aug. 2006
Beiträge
17
Hi,

ich lese mit DirectX den FrontBuffer aus und speichere die Surface dann im Ramm als BMP.

LPD3DXBUFFER pBuffer = NULL;
g_pd3dDevice->CreateOffscreenPlainSurface(1920, 1080, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &g_pSurface, NULL);
g_pd3dDevice->GetFrontBufferData(0, g_pSurface);
D3DXSaveSurfaceToFileInMemory(&pBuffer, D3DXIFF_BMP, g_pSurface, NULL,NULL);

nun bin ich mir aber nicht sicher wie genau ich nun auf die BMP im Ramm zugreife... kann ich dies genau so tun wie auf der festplatte

// Variablen
HANDLE hfile;
DWORD written;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
RGBTRIPLE *image;
LONG imagesize;

//Einlesen
// Open the file
hfile = CreateFile(L"D:\Screenshot.bmp",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);
// Read the header
ReadFile(hfile,&bfh,sizeof(bfh),&written,NULL);
ReadFile(hfile,&bih,sizeof(bih),&written,NULL);
// Read image
imagesize = bih.biWidth*bih.biHeight; // Helps you allocate memory for the image
image = new RGBTRIPLE[imagesize]; // Create a new image (I'm creating an array during runtime)
ReadFile(hfile,image,imagesize*sizeof(RGBTRIPLE),&written,NULL); // Reads it off the disk
// Close source file
CloseHandle(hfile);

Dies schreibt mir ja die BMP in den RAM aber halt als RGBTRIPLE * und auf den LPD3DXBUFFER muss ich sicher anders zugreifen nur finde ich nirgens wie.

Vielen Dank für die Antworten.

DonPsycho
 
Mache es nun über

memcpy(&bfh,pBuffer,sizeof(bfh));
memcpy(&bih,pBuffer,sizeof(bih));
imagesize = pBuffer->GetBufferSize();// Helps you allocate memory for the image
image = new RGBTRIPLE[imagesize]; // Create a new image (I'm creating an array during runtime)


memcpy(image,pBuffer,imagesize*sizeof(RGBTRIPLE));

da readfile nur murks zurückliefert.
bfh und bih haben sinnvolle werte. leider ist bih.width 1 und bih.height 8MB aber naja...

nur bekomme ich nun bei

memcpy(image,pBuffer,imagesize*sizeof(RGBTRIPLE));

den fehler


Unhandled exception at 0x69fafe06 (msvcr90d.dll) in Ambilight.exe: 0xC0000005: Access violation reading location 0x0020c000.

ich denke es liegt an imagesize*sizeof rgb ist zu groß aber ich wüste net welche größe da sonst reinkommen sollte...

wenn ich die size in memcpy ganz klein einstelle kommt kein fehler... jedoch egal für welche kleine zahl es wird nur image[0] beschrieben


Und wie kann ich auf die einzelnen Pixel genau ansteuern im image... da mir bih ja keine praktikablen höhe und breite liefert?
 
Zuletzt bearbeitet:
ist auch völliger unsinn was du da machst.. wie ich bereits geschrieben habe kriegst du nen zeiger auf die BMP-daten über pBuffer->GetBufferPointer(). dort findet sich dann auch der bitmap header, und nicht etwa ein RGBTRIPLE.
 
Also wenn ich jetzt den bih auslese bekomme ich für festplatte und ramm völlig unterschiedliche werte. es ist doch richtig den bih sich über memcpy zu holen oder welche funktion müsste ich dafür benutzen?

die bfh stimmen allerdings überein.

memcpy(&bih,pBuffer->GetBufferPointer(),sizeof(bih)) // wahrscheinlich unsinn da pBuffer->GetBufferPointer() nicht auf bih zeigt sondern auf den anfang wo bfh steht

bih ramm

biSize 2419608898 unsigned long
biWidth 126 long
biHeight 3538944 long
biPlanes 0 unsigned short
biBitCount 40 unsigned short
biCompression 125829120 unsigned long
biSizeImage 70778880 unsigned long
biXPelsPerMeter 65536 long
biYPelsPerMeter 32 long
biClrUsed 0 unsigned long
biClrImportant 185729024 unsigned long



ReadFile(hfile,&bih,sizeof(bih),&written,NULL);

bih festplatte

biSize 40 unsigned long
biWidth 1920 long
biHeight 1080 long
biPlanes 1 unsigned short
biBitCount 32 unsigned short
biCompression 0 unsigned long
biSizeImage 0 unsigned long
biXPelsPerMeter 2834 long
biYPelsPerMeter 2834 long
biClrUsed 0 unsigned long
biClrImportant 0 unsigned long

und wenn ich dieses nun habe wie komme ich denn nur über den header an die einzelnen pixel?

sorry es ist mir wirklich ein rätsel wie ich von nem void* pointer an das bitmap komme. ich habe mir nochmal die komplette msdn dokumentation zu bitmaps angesehen aber konnte nix finden wie ich c++ begreiflich mache das dort im speicher nun ne bitmap steht und er damit umgehen darf wie mit einer. Dort im ramm steht das bitmap ja auch in der gleichen form wie es auf der festplatte stehen würde wenn ich mich nich irre... doch keine der BITMAP klassen konstruktoren http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.bitmap.aspx lässt nen void* ptr als quelle zu.

ich weiß im speicher müsste zuerst der BITMAPFILEHEADE stehen und so lang sein :0x00 0x0D dann BITMAPINFOHEADER 0x0E 0x35 und dann ein RGBQUAD array und dann Color-index array... nur bekomme meinen pBuffer->GetBufferPointer() auch nicht verschoben..
 
Zuletzt bearbeitet:
Zurück
Oben