SDL2 C++ 截屏

问题描述 投票:0回答:3

您好,我想知道是否可以使用 SDL2 简单地截取屏幕截图。 我尝试了

SDL_GetWindowSurface
但收到错误消息:

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

我从这里获取了代码。

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

你有什么解决办法吗?

c++ screenshot sdl-2
3个回答
29
投票

看起来你正在混合渲染系统。该方法仅适用于软件渲染的上下文。对于硬件渲染,您应该使用方法

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);

其中 wh 是屏幕宽度和高度(您可以使用

SDL_GetRendererOutputSize()
获取这些值)。


3
投票

在 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

...把东西放在这里...

#endif

否则,正如评论中所说,编译时可能会出现多个定义错误:{ 我的错:{

不要犹豫,检查函数原型的返回类型和参数,这里的注释只是提供信息,而不是更多。


0
投票

您可以使用更紧凑的格式 SDL_PIXELFORMAT_RGB24,而不是 ARGB8888 格式(每像素 32 位):

SDL_Surface* sshot = SDL_CreateRGBSurfaceWithFormat(0, cdest.w, cdest.h, 24, SDL_PIXELFORMAT_RGB24);

SDL_RenderReadPixels(渲染器,NULL,SDL_PIXELFORMAT_RGB24,sshot->像素,sshot->间距);

SDL_SaveBMP(快照, 文件名);

SDL_FreeSurface(sshot);

© www.soinside.com 2019 - 2024. All rights reserved.