SDL_RenderReadPixels returns 黑色矩形?
SDL_RenderReadPixels returns a black rectangle?
我正在尝试使用 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
创建的 window,它仍然完全是黑色的。在另一个论坛上,他们提到这可能与双缓冲问题有关。我不知道如何解决这样的问题。
您对 SDL_RenderReadPixels()
的作用存在根本性的误解。实际上,它用于获取 "screenshots",但 "screenshot" 将是您使用 特定渲染器 渲染的内容,仅此而已。您将无法使用 SDL 中提供的任何内容来完成您想要的。
截取整个屏幕的屏幕截图通常需要提升权限(我不知道 Windows)并且超出了 SDL 的范围。
我正在尝试使用 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
创建的 window,它仍然完全是黑色的。在另一个论坛上,他们提到这可能与双缓冲问题有关。我不知道如何解决这样的问题。
您对 SDL_RenderReadPixels()
的作用存在根本性的误解。实际上,它用于获取 "screenshots",但 "screenshot" 将是您使用 特定渲染器 渲染的内容,仅此而已。您将无法使用 SDL 中提供的任何内容来完成您想要的。
截取整个屏幕的屏幕截图通常需要提升权限(我不知道 Windows)并且超出了 SDL 的范围。