glReadPixels und glReadBuffer
-
SERVUS.
in anlehnung an beitrag "C/C++ Forum::Spiele-/Grafikprogrammierung::glReadPixels schlägt fehl (??)" habe ich folgenden code geschrieben, um ein screenshot in meinem opengl window zu erhalten:
#include <EasyBMP.h> .... BMP Image; byte *buffer; int iMDIHeight; RECT rcClient; HWND hTool; RECT rcTool; int iToolHeight; hTool = GetDlgItem(hWnd,IDC_MAIN_TOOL); GetWindowRect(hTool,&rcTool); iToolHeight = rcTool.bottom - rcTool.top; GetClientRect(hWnd,&rcClient); iMDIHeight = rcClient.bottom - iToolHeight; buffer = new byte[rcClient.right*iMDIHeight*4]; memset(buffer, 0, sizeof(byte)*rcClient.right*iMDIHeight*4); glReadBuffer (GL_FRONT); glReadPixels(0,0,rcClient.right,iMDIHeight,GL_RGBA,GL_UNSIGNED_BYTE,buffer); k=0; Image.SetSize(rcClient.right,iMDIHeight); for (i=0;i<rcClient.right;i++) { for (j=0;j<iMDIHeight;j++) { Image(j,i)->Red = (int) buffer[k]; Image(j,i)->Green = (int) buffer[k+1]; Image(j,i)->Blue = (int) buffer[k+2]; k=k+2; } } Image.WriteToFile("test1.bmp");nun habe ich das problem, dass mein ergebnisbild aus total wild angeordneten bunten pixeln besteht. der rechte rand ist weis. woran kann das liegen?
DANKE.
STICK.
-
Du erfragst ein RGBA Format, speicherst aber nur RGB?
-
frage ich RGB format ab und speichere RGB, ändert sich das ergebnis-bild leider auch nicht.
STICK.
p.s.: brauche ich eigentlich die GLUT header datei für diese funktion?
-
Du erhöhst k bei jeder Iteration um 2, liest aber aus deinem Puffer immer 3 Bytes. Du schreibst also bei Rot den Blau-Wert des vorherigen Pixels rein. Probier es also mal mit k+=3; in jedem Durchgang.
-
danke, war ein dummer fehler, habe ihn inzwischen auch korrigiert. das programm funktioniert aber leider trotzdem noch nicht.
das ergebnisbild enthält jetzt viele weisse streifen, der obere und rechte bild rand sind immer noch total weiss. da farbwerte in den restlichen streifen hauen ungefähr mit dem opengl - bild hin, geben aber nicht annähernd das originalbild wieder.
gibts dazu noch irgendwelche vorschläge?
DANKE.
STICK.
-
Also ich mache das immer so:
Zuerst muss geprüft werden, ob die Pixeldaten auch tatsächlich so vorliegen.
Dazu erstelle ich ein schwarzes Bild mit 3 Pixeln (rot, gruen, blau).
Müsste hier wohl in die linke untere Ecke.
Wenn der glReadPixel ausgeführt ist, muss irgendwie geprüft werden, ob und wo die Pixel nun im Speicher stehen. Am Einfachsten geht das mit dem Debugger über die Speicheransicht. An der entsprechnenden Stelle müsste ja dann etwas in der FormFF 00 00 00 FF 00 00 00 FF ...stehen.
Wenn das passt, solltest du später mit einen HexEditor genauso prüfen, ob die Daten auch richtig geschrieben wurden.
-
danke für den tip. ich versuche das mal umzusetzen, wenn ich aus dem verlängerten wochenurlaub wiederkomme.
muss mir aber dazu überlegen, wie ich das hier mache:Am Einfachsten geht das mit dem Debugger über die Speicheransicht.
STICK.
-
hallo.
das problem ist jetzt gelöst. ich hatte BREITE und HÖHE vertauscht, darum wurde das bild verzerrt wiedergegeben.
DANKE.
STICK.