C++ SDL2 C++;截图

C++ SDL2 C++;截图,c++,screenshot,sdl-2,C++,Screenshot,Sdl 2,嗨,我想知道是否有可能简单地用SDL2截图。 我尝试了SDL\u GetWindowSurface,但出现了一个错误,错误是: 没有可用的硬件加速渲染器 我从我的电脑上获取了密码 我考虑的另一个解决方案是将纹理转换为曲面,但我没有做到这一点 您有什么解决方案吗?看起来您在混合渲染系统。该方法仅在软件渲染的上下文中有效。对于硬件渲染,应使用方法SDL\u RenderReadPixels()。要保存屏幕截图,您需要这样的代码: SDL_Surface *sshot = SDL_CreateRGBS

嗨,我想知道是否有可能简单地用SDL2截图。 我尝试了
SDL\u GetWindowSurface
,但出现了一个错误,错误是:

没有可用的硬件加速渲染器

我从我的电脑上获取了密码

我考虑的另一个解决方案是将纹理转换为曲面,但我没有做到这一点


您有什么解决方案吗?

看起来您在混合渲染系统。该方法仅在软件渲染的上下文中有效。对于硬件渲染,应使用方法
SDL\u RenderReadPixels()
。要保存屏幕截图,您需要这样的代码:

SDL_Surface *sshot = SDL_CreateRGBSurface(0, w, h, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
SDL_RenderReadPixels(renderer, NULL, SDL_PIXELFORMAT_ARGB8888, sshot->pixels, sshot->pitch);
SDL_SaveBMP(sshot, "screenshot.bmp");
SDL_FreeSurface(sshot);

其中wh是屏幕的宽度和高度(可以使用
SDL\u getrenderoutputsize()
获得这些值)。

在C SDL2 2.0.3版中,它可用于:

fenetre=SDL_GetWindowFromId(touche.windowID); // "touche" is a   SDL_KeyboardEvent, "fenetre" is a SDL_window pointer

r_copie=SDL_GetRenderer(fenetre);

s_SnapSource=SDL_CreateRGBSurface(0,SCREEN_WIDTH,SCREEN_HEIGHT,32,
rmask,
gmask,
bmask,
amask); // s_SnapSource is a SDL_Surface pointer

SDL_LockSurface(s_SnapSource);
SDL_RenderReadPixels(r_copie,NULL,s_SnapSource->format->format,
s_SnapSource->pixels,S_SnapSource->pitch);

SDL_SaveBMP(s_SnapSource,NomFichier); // NomFichier is a char*
SDL_UnlockSurface(s_SnapSource);
SDL_FreeSurface(s_SnapSource);
/!\注意\

#if SDL_BYTEORDER == SDL_BIG_ENDIAN
    Uint32 rmask = 0xff000000;
    Uint32 gmask = 0x00ff0000;
    Uint32 bmask = 0x0000ff00;
    Uint32 amask = 0x000000ff;  
#else
    Uint32 rmask = 0x000000ff;
    Uint32 gmask = 0x0000ff00;
    Uint32 bmask = 0x00ff0000;
    Uint32 amask = 0xff000000;
#endif
…当然,在使用这些变量之前,必须在某个地方进行设置^^

如果你想把它放在一个头文件中,确保你放了一些“警卫”,比如

#ifndef ENDIANNESS #定义端点

…把东西放在这里

#恩迪夫

否则,如注释中所述,编译时可能会出现多个定义错误:{ 我的错:{


请毫不犹豫地检查函数原型的返回类型和参数,此处的注释只是提供信息,而不是更多信息。

成功了!!!顺便说一句,如果要保存修改的纹理,只需将其与:SDL\u SetRenderTarget()一起使用即可谢谢,回答得很好!提问者提到的使用
SDL\u renderAdpixels
读取数据。调用
SDL\u GetWindowSurface
似乎只是为了建立要输入
SDL\u CreateRGBSurface
的参数。您已经对这些值进行了硬编码,但这可以依赖吗?您如何查询这些值使用新API的e值?谢谢!在仔细研究了这一点并查看了文档之后,我想我现在可以回答我自己的问题了:位深度和通道掩码是硬编码的,但是由于它们是根据
SDL\u renderradpixels
中要求的格式设置的,所以渲染器的像素在origi中是什么格式并不重要最后。
surface=SDL\u GetWindowSurface(窗口)
format=SDL\u GetWindowPixelFormat(窗口)
如果您不介意使用SDL_窗口已经使用的任何设置,实际上可以为您填写这些内容。@TalesM:您使用的方法不是独立于sw/hw渲染,并且应该在这两种情况下都有效吗?为什么以及何时在链接的答案中使用该方法?请您详细说明一下,好吗?谢谢。您的答案可以是impro通过提供更多的上下文来解释。你对结尾的理解是正确的,但即使你说这或那是一个
char*
,你也不会显示它是什么。这对解释某些东西是如何工作的没有帮助。此外,如果你使用include-guards,你应该能够避免在头文件中放入t-hose。哦,你不包括变量本身非常重要。查看每个函数返回的内容,可以得到变量类型。需要知道函数mecanism在攻击SDL2库时是如何工作的。我是说法语的,“NomFichier is char*”并不是每个“man SDL_SaveBMP”都需要的将为您提供函数的原型,法语的“NomFichier”为您提供“FileName”,因此这是您要保存到的文件的路径…所有这些函数都记录在SDL2中。是的,我同意您必须在RGBA定义之前放置一个“guard”…然后关闭它^^