c++ - SDL_RenderReadPixels 返回一个黑色矩形?

标签 c++ sdl sdl-2

我正在尝试使用 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/

相关文章:

c++ - 如何检测何时释放 key (SDL 2.0)

c++ - SDL2 运行得太快了——为什么当我只按一个按钮时它会读取多个输入?

sdl-2 - 为什么SDL_GetWindowWMInfo()需要SDL版本?

c函数重复执行而不被调用,导致段错误

c++ - 默认赋值运算符适合 Vector 吗?

c++ - 可以通过 C++ 流工具更改文件扩展名吗?

c++ - 编译器去虚拟化,是不是太聪明了?

C++ 通过引用 dll 中的函数传递 std::string

gcc 编译 SDL 的正确命令行参数

java - 将 SDL 2.0 游戏移植到 Android