SDL_RenderReadPixels возвращает черный прямоугольник? - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь использовать 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, оно по-прежнему полностью черное. На другом форуме они упоминали, что это может быть связано с проблемой двойной буферизации. Я не знаю, как решить такую ​​проблему, хотя.

1 Ответ

0 голосов
/ 12 сентября 2018

У вас есть фундаментальное неправильное представление о том, что делает SDL_RenderReadPixels().На самом деле он используется для создания «скриншотов», но «скриншот» будет иметь то, что вы визуализировали с помощью этого конкретного средства визуализации , и ничего больше.Вы не сможете выполнить то, что хотите, используя все, что доступно в SDL.

Для создания снимка экрана всего экрана обычно требуются повышенные разрешения (я понятия не имею о Windows) и выход за рамки SDL.

...