簡體   English   中英

SDL2 C++ 截圖

[英]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);

其中wh是屏幕寬度和高度(您可以使用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);

/!\\ 注意力 /!\\

#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

...當然必須在使用這些變量之前先在某處設置^^

如果你想把它放在一個頭文件中,確保你放了一些“守衛”,比如

#ifndefENDIANNESS #定義ENDIANNESS

……把東西放在這里……

#萬一

否則,如評論中所述,編譯時可能會出現多個定義錯誤:{我的錯:{

不要猶豫,檢查返回類型和參數的函數原型,這里的注釋只是提供信息,而不是更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM