SDL2 C ++截图

时间:2014-03-11 03:38:57

标签: c++ screenshot sdl-2

您好我想知道是否可以简单地使用SDL2截取屏幕截图。 我试过了SDL_GetWindowSurface,但我收到了一条错误消息:

  

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

我从here获取了代码。

我想到的另一个解决方案是将纹理转换为表面,但我没有设法这样做......

你有解决方案吗?

2 个答案:

答案 0 :(得分:13)

看起来你正在混合渲染系统。该方法仅适用于软件渲染。对于硬件渲染,您应该使用方法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()获取这些值。)

答案 1 :(得分:1)

在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

...必须先在某处设置(例如在.h文件中)

编辑:需要更正

不要将上一段放在 .h 文件中,因为如果在项目中使用多个源文件,可能会导致变量的多重定义* mask ...把它放在一个函数实现中......而不是......