2017-04-26 9 views
1

Ich versuche, die Ausgabe meines Renderings in Datei zu speichern. Ich verwende FreeImage bereits als Abhängigkeit, daher möchte ich es weiterhin verwenden. Ich verwende glReadPixels, um die RGB-Werte aus dem Puffer zu lesen. Diese Werte wurden als GLubytes in den Puffer eingegeben, also muss ich sie als solche lesen. Allerdings, wenn ich das folgende Code-Snippet ausführen, die FreeImage_ConvertFromRawBits Aufruf seg Fehler und ich verstehe nicht warum. Ich habe the docs konsultiert, und es scheint, dass ich alles richtig mache. Ist noch jemand auf dieses Problem gestoßen?OpenGL glReadPixels zu FreeImage Bitmap

GLubyte pixels[3*_winWidth*_winHeight]; 
glReadPixels(0, 0, _winWidth, _winHeight, GL_RGB, GL_UNSIGNED_BYTE, pixels); 
FIBITMAP *bitmap = FreeImage_ConvertFromRawBits(pixels, _winWidth, 
    _winHeight, 3 *_winWidth, 24, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, 
    FI_RGBA_BLUE_MASK, false); 
+0

@genpfault: Ich hatte das vorher und das gleiche Problem, obwohl Sie richtig sind, sollte es auf jeden Fall zurückgeschaltet werden – marcman

+0

Aye, [hier ya go] (http://Stackoverflow.com/a/17371181/44729), fühlen frei, um darauf zu bauen. – genpfault

+0

Ich werde es versuchen, danke! – marcman

Antwort

1

Ich sah ein bisschen diese Frage, nachdem Sie es geschrieben. Wenn ich mich recht erinnere, denke ich, du hast gesagt, dein Schnipsel sei im Gegensatz zu dem, was du tatsächlich verwendest, vereinfacht worden.

Daher ist die beste Schätzung dann, dass Sie nicht genügend Speicher für pixels zuweisen.

Hier ist ein vollständigeres Beispiel für das Erstellen eines Screenshots und das Speichern mit FreeImage.

BYTE *pixels = (BYTE*)malloc(width * height * 3); 

glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, pixels); 

FIBITMAP *image = FreeImage_ConvertFromRawBits(pixels, width, height, 3 * width, 24, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, FALSE); 

if (FreeImage_Save(FIF_BMP, image, "screenshot.bmp", 0)) 
    printf("Successfully saved!\n"); 
else 
    printf("Failed saving!\n"); 

FreeImage_Unload(image); 

free(pixels); 

Hier können Sie sehen, dass OpenGL sowie der Bildbetrachter dasselbe zeigen.

Schließlich erinnerte ich mich etwas über die Farbmaske überflüssig zu sein. Ich schaute ein bisschen herum und fand diesen Thread von 2005.

Im Moment werden Farbmaske nur für 16-Bit-RGB-Bilder verwendet, deshalb produziert Ihr Code zwei identische Bilder.

FreeImage Thread, 2005

Es ist natürlich ein alter Thread, so nehmen Sie es mit einem Körnchen Salz. Ich konnte jedoch keine neueren Erwähnungen finden. Das Ändern der Masken für FreeImage_ConvertFromRawBits() hatte keine Auswirkung, als ich es testete.

Verwandte Themen