【问题标题】:SDL_RenderReadPixels returns a black rectangle?SDL_RenderReadPixels 返回一个黑色矩形?
【发布时间】: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
  • 另外,RenderReadPixelsthis 文档页面上没有任何内容暗示它只能在这种情况下使用。

标签: c++ sdl sdl-2


【解决方案1】:

您对SDL_RenderReadPixels() 的作用存在根本性的误解。实际上,它用于拍摄“屏幕截图”,但“屏幕截图”将是您使用该特定渲染器渲染的内容,仅此而已。您将无法使用 SDL 中提供的任何东西来完成您想要的事情。

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

【讨论】:

  • 是的,无论如何我都需要 png 支持,所以看起来我将不得不再次深入研究 ffmpeg。并使用winapi。感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多