你好,我想知道是否可以使用SDL2轻松地进行截屏。 我尝试了SDL_GetWindowSurface
,但出现错误:
没有可用的硬件加速渲染器。
我从这里获取了代码。
另一个解决方案是将纹理转换为表面,但我没有成功...
您有什么解决方案吗?
你好,我想知道是否可以使用SDL2轻松地进行截屏。 我尝试了SDL_GetWindowSurface
,但出现错误:
没有可用的硬件加速渲染器。
我从这里获取了代码。
另一个解决方案是将纹理转换为表面,但我没有成功...
您有什么解决方案吗?
看起来你混淆了渲染系统。那种方法只在软件渲染的情况下有效。对于硬件渲染,你应该使用 SDL_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);
其中w和h分别表示屏幕的宽度和高度(你可以使用SDL_GetRendererOutputSize()
函数获得这些值)。
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 #define ENDIANNESS
...将内容放在这里...
#endif
否则,如评论中所述,编译时可能会出现多个定义错误 :{ 是我的错 :{
请务必查看函数原型的返回类型和参数,此处的注释仅提供信息,不做更多解释。
char *
,你也没有展示它是什么。当试图解释某些东西的工作原理时,这并不是很有帮助。此外,如果你使用包含保护,你应该能够将它们放在头文件中。哦,你还没有包括变量的类型,这本身就是相当关键的。 - Pryftan
SDL_RenderReadPixels
来读取数据。调用SDL_GetWindowSurface
似乎只是为了建立要传递给SDL_CreateRGBSurface
的参数。您已经硬编码了这些值,但这可靠吗?如何使用新API查询这些值?谢谢! - Leosurface = SDL_GetWindowSurface(window)
和format = SDL_GetWindowPixelFormat(window)
可以为您填充这些内容,只要您不介意使用您的 SDL_Window 已经使用的任何设置。 - RectangleEquals