Wie kann ich mit SDL_Window * und SDL_Renderer * einen Screenshot in SDL 2.0 erstellen und speichern?Wie kann ich einen BMP-Screenshot in SDL 2 aufnehmen und speichern?
14
A
Antwort
11
Unten ist eine Funktion zum Speichern eines Screenshots in SDL 2 aus einer Bibliothek, die ich gerade schreibe.
bool saveScreenshotBMP(std::string filepath, SDL_Window* SDLWindow, SDL_Renderer* SDLRenderer) {
SDL_Surface* saveSurface = NULL;
SDL_Surface* infoSurface = NULL;
infoSurface = SDL_GetWindowSurface(SDLWindow);
if (infoSurface == NULL) {
std::cerr << "Failed to create info surface from window in saveScreenshotBMP(string), SDL_GetError() - " << SDL_GetError() << "\n";
} else {
unsigned char * pixels = new (std::nothrow) unsigned char[infoSurface->w * infoSurface->h * infoSurface->format->BytesPerPixel];
if (pixels == 0) {
std::cerr << "Unable to allocate memory for screenshot pixel data buffer!\n";
return false;
} else {
if (SDL_RenderReadPixels(SDLRenderer, &infoSurface->clip_rect, infoSurface->format->format, pixels, infoSurface->w * infoSurface->format->BytesPerPixel) != 0) {
std::cerr << "Failed to read pixel data from SDL_Renderer object. SDL_GetError() - " << SDL_GetError() << "\n";
pixels = NULL;
return false;
} else {
saveSurface = SDL_CreateRGBSurfaceFrom(pixels, infoSurface->w, infoSurface->h, infoSurface->format->BitsPerPixel, infoSurface->w * infoSurface->format->BytesPerPixel, infoSurface->format->Rmask, infoSurface->format->Gmask, infoSurface->format->Bmask, infoSurface->format->Amask);
if (saveSurface == NULL) {
std::cerr << "Couldn't create SDL_Surface from renderer pixel data. SDL_GetError() - " << SDL_GetError() << "\n";
return false;
}
SDL_SaveBMP(saveSurface, filepath.c_str());
SDL_FreeSurface(saveSurface);
saveSurface = NULL;
}
delete[] pixels;
}
SDL_FreeSurface(infoSurface);
infoSurface = NULL;
}
return true;
}
Prost! -Neil
6
Wenn Sie OpenGL mit SDL2 verwenden, können Sie glReadPixels
direkt aufrufen, anstatt die Infooberfläche und den Renderer zu verwenden. Hier ist ein Beispiel (ohne Fehlerprüfung).
void Screenshot(int x, int y, int w, int h, const char * filename)
{
unsigned char * pixels = new unsigned char[w*h*4]; // 4 bytes for RGBA
glReadPixels(x,y,w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
SDL_Surface * surf = SDL_CreateRGBSurfaceFrom(pixels, w, h, 8*4, w*4, 0,0,0,0);
SDL_SaveBMP(surf, filename);
SDL_FreeSurface(surf);
delete [] pixels;
}
Hier ist die SDL wiki page mit einem Beispiel für die Einstellung der Fenster und eine OpenGL-Kontext auf.
Verwandte Themen
- 1. Video aufnehmen und auf dem Server speichern?
- 2. Wie zeichne ich einen gefüllten Sektor einer Ellipse mit SDL 2 und C++
- 3. Bild aufnehmen und speichern bei Tastendruck
- 4. Wie kann ich einen Prozess speichern?
- 5. Ich kann kein Bild in einen TCPDF-Header aufnehmen
- 6. Wie kann ich den `Genindex` in ein Sphinx TOC aufnehmen?
- 7. Wie verwende ich Qt und SDL zusammen?
- 8. Continuous Window Resize Event in SDL 2
- 9. Kann ich den Docker-Container anhalten und dann wieder aufnehmen?
- 10. Wie kann ich Videos aufnehmen und Musik im Hintergrund abspielen?
- 11. Aufnehmen, Speichern und Abspielen eines Videos in Android
- 12. Wie Bildschirm aufnehmen und als GIF-Animation speichern?
- 13. SDL/C++ OpenGL-Programm, wie stoppe ich SDL abfangen SIGINT
- 14. Erkennen und einen Sound mit Python aufnehmen
- 15. Wie kann ich einen Float-Wert in einem NSArray speichern?
- 16. Wie kann ich einen Song aufnehmen, der gleichzeitig mit AVPlayer und einer WAV-Datei abgespielt wird?
- 17. Wie kann ich mysql wie eine Daten aufnehmen?
- 18. Wie kann ich einen Wert (String) in einer Webseite speichern
- 19. Wie kann ich Videos in iOS aufnehmen (CUSTOM)?
- 20. Wie kann ich einen GridView-Zellenwert in einer Sitzungsvariablen speichern?
- 21. Wie kann ich einen Funktionszeiger in einer Struktur speichern?
- 22. Wie kann ich einen OData4-Dienst in Java mit Olingo oder dem SDL OData Framework verwenden
- 23. In Android Wie kann ich einen RTSP-Stream in der Datei speichern, während Sie es abspielen?
- 24. Video mit AVCaptureSession aufnehmen, CIFilter hinzufügen und im Fotoalbum speichern
- 25. Wie kann ich das AMR-Audioformat auf dem iPhone aufnehmen?
- 26. Wie kann ich eine Teilmenge einer CPP-Datei in einen Doxygen-Kommentar aufnehmen?
- 27. iPhone - AVAudioRecorder - Wie kann ich eine MP3 aufnehmen?
- 28. Wie kann ich CSS-Datei mit com.sun.net.httpserver aufnehmen?
- 29. bezüglich der Auflösung und Genauigkeit in SDL
- 30. Unterschied zwischen SDL und GLUT
'Pixel = NULL;' sollte 'delete [] pixels;' sein, andernfalls ist das Array durchgesickert. – emlai