【发布时间】:2018-09-12 05:44:05
【问题描述】:
我正在尝试使用 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 创建的窗口,它仍然是全黑的。在另一个论坛上,他们提到这可能与双缓冲问题有关。我不知道如何解决这样的问题。
【问题讨论】:
-
RenderReadPixels 读取您之前通过其他 SDL 渲染器函数绘制的数据,或者有时使用 SDL 渲染器使用的底层图形 API (d3d/opengl/vulkan);它不读取其他数据,尤其是属于不同应用程序的数据。由于您已经使用了特定于操作系统的功能,因此您有更好的机会一直到例如stackoverflow.com/questions/3291167/…
-
您到底希望在这里发生什么?你从不渲染任何东西。
-
@BradAllred 我不知道,可能与这个网站上的一个问题有关,特别是在 screenshot example 中使用
RenderReadPixels。 -
另外,
RenderReadPixels的 this 文档页面上没有任何内容暗示它只能在这种情况下使用。