SDL_RenderReadPixels返回黑色矩形?

问题描述 投票:0回答:1

我正在尝试使用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创建的窗口,它仍然是完全黑色的。在另一个论坛上,他们提到这可能与双缓冲问题有关。我不知道如何解决这个问题。

c++ sdl sdl-2
1个回答
2
投票

你对SDL_RenderReadPixels()的作用有一个根本的误解。实际上,它用于拍摄“屏幕截图”,但“屏幕截图”将是您使用该特定渲染器渲染的内容,而不是其他内容。使用SDL中的任何可用内容,您将无法完成所需的任务。

截取整个屏幕的截图通常需要提升权限(我不知道Windows),并且超出了SDL的范围。

© www.soinside.com 2019 - 2024. All rights reserved.