我正在尝试使用 SDL2 在 Windows 中截取整个桌面的屏幕截图。但是,当查看生成的 .bmp
文件时,它完全是黑色的。任何帮助将不胜感激。
这是我的代码:
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window* window = SDL_CreateWindowFrom(GetDesktopWindow());
int w, h;
SDL_GetWindowSize(window, &w, &h);
uint32_t wnd_pix_fmt = SDL_GetWindowPixelFormat(window);
if(wnd_pix_fmt == SDL_PIXELFORMAT_UNKNOWN)
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Window pix fmt error", SDL_GetError(), NULL);
SDL_Surface* screenshot = SDL_CreateRGBSurfaceWithFormat(0, w, h, 32, wnd_pix_fmt);
if(!screenshot)
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "RGB surface error", SDL_GetError(), NULL);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
if(!renderer)
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Renderer error", SDL_GetError(), NULL);
if(SDL_RenderReadPixels(renderer, &screenshot->clip_rect, screenshot->format, screenshot->pixels, screenshot->pitch))
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "RendererReadPixels error", SDL_GetError(), NULL);
SDL_SaveBMP(screenshot, "screenshot.bmp");
SDL_FreeSurface(screenshot);
注意:即使我将 SDL_Window* window
设置为使用 SDL_CreateWindow
创建的窗口,它仍然是全黑的。在另一个论坛上,他们提到这可能与双缓冲问题有关。我不知道如何解决这样的问题。
最佳答案
您对 SDL_RenderReadPixels()
的作用存在根本性的误解。事实上,它用于拍摄“屏幕截图”,但“屏幕截图”将是您使用该特定渲染器渲染的内容,仅此而已。您将无法使用 SDL 中提供的任何内容来完成您想要的。
截取整个屏幕的屏幕截图通常需要提升权限(我对 Windows 一无所知)并且超出了 SDL 的范围。
关于c++ - SDL_RenderReadPixels 返回一个黑色矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52288191/