SDL2 C++ Taking a screenshot
SDL2 C++ Taking a screenshot
嗨,我想知道是否有可能简单地用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()
获得这些值)。
在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);
/! attention/!
#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
…必须在使用这些变量之前设置^^
如果你想把它放在头文件中,一定要加上"guard "像
的ifndef字节顺序#定义字节顺序
…把东西放在这里…
# endif否则,如注释所述,编译时可能会出现多个定义错误:{我的错:{
不要犹豫,检查函数原型的返回类型和参数,这里的注释只是提供信息,而不是更多。
相关文章:
- 隐式转换产生"error: taking address of temporary"(GCC 与 clang)
- 当"taking address of temporary"错误妨碍干净的代码时
- 忽略"taking address of temporary"错误
- Taking into account
- "term does not evaluate to a function taking 0 arguments"错误
- 标准::平等给出"Term doesnt evaluate to a function taking 2 arguments"
- "taking address of temporary"警告
- 如何避免"taking address of temporary"没有问题?
- 如何从Adobe AIR应用程序获取HDC或ScreenShot
- C++错误:"taking address of temporary array"
- CS2064 "term does not evalute a function taking 1 argument" ?
- boost::bimap not taking vector_of
- "术语不计算为函数taking"在全局对象中
- SDL2 C++ Taking a screenshot