如何使用C#与XNA制作屏幕截图?

6
如何在全屏模式下运行游戏时使用C#和XNA进行屏幕截图并保存到硬盘?

重复的问题:如何在XNA中截屏 - Brook
但是,我想在运行时制作它,而且我没有像“ResolveTexture2D”这样的东西,并保存它,而不是打印。 - Neomex
这个问题不是重复的(无论如何也不是那个)。XNA 4.0中API已经更改,那里的答案不适用。 - Andrew Russell
3个回答

8

这个API在XNA 4.0中发生了变化

如果你正在运行HiDef配置文件(Xbox 360和更新的Windows机器),你可以使用GraphicsDevice.GetBackBufferData

为了方便保存这些数据,你可以将输出放入Texture2D.SetData中,然后使用SaveAsPngSaveAsJpeg(这会稍微慢一点,因为它还会将数据发送回GPU,但是这样做非常简单)。

如果你正在使用Reach配置文件,则必须将场景渲染到一个RenderTarget2D中。我的答案应该会给你一个很好的起点。


如何在使用GraphicsDeviceManager时实现此操作?(我是初学者,请原谅我这样愚蠢的问题 :)) - Neomex
我不太明白你的问题。你是在寻找GraphicsDeviceManager.GraphicsDevice吗?你应该查看MSDN来了解这些内容。当然,如果你在从GameGameComponent派生的类中,它们有GraphicsDevice属性,你可以直接访问。 - Andrew Russell

4

请看这段代码。

count += 1;
string counter = count.ToString();

int w = GraphicsDevice.PresentationParameters.BackBufferWidth;
int h = GraphicsDevice.PresentationParameters.BackBufferHeight;

//force a frame to be drawn (otherwise back buffer is empty) 
Draw(new GameTime());

//pull the picture from the buffer 
int[] backBuffer = new int[w * h];
GraphicsDevice.GetBackBufferData(backBuffer);

//copy into a texture 
Texture2D texture = new Texture2D(GraphicsDevice, w, h, false, GraphicsDevice.PresentationParameters.BackBufferFormat);
texture.SetData(backBuffer);

//save to disk 
Stream stream = File.OpenWrite(counter + ".jpg");

texture.SaveAsJpeg(stream, w, h);
stream.Dispose();

texture.Dispose();

0

这个答案向你展示如何截屏。在这个例子中,它会在每次渲染时保存一张图片,所以你只需要将它移动到一个函数中,当你想要保存截图时就可以调用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接