我正在尝试从托管 DirectX 应用程序捕获呈现的屏幕。通常,执行此操作的方法如下:
Surface renderTarget = device.GetRenderTarget(0);
SurfaceLoader.Save(snapshotName, ImageFileFormat.Bmp, renderTarget);
这(在我的理解中)是以下内容的简写:
Surface renderTarget = device.GetRenderTarget(0);
Surface destTarget = device.CreateOffscreenPlainSurface(ClientRectangle.Width, ClientRectangle.Height, graphicsSettings.WindowedDisplayMode.Format, Pool.SystemMemory);
device.GetRenderTargetData(renderTarget,destTarget);
SurfaceLoader.Save(snapshotName,ImageFileFormat.Bmp, destTarget);
问题是在不支持非二维幂纹理的旧显卡上,上述方法失败了。我尝试了许多变通方法,但似乎没有任何方法可以完成保存任意尺寸屏幕截图这个看似简单的任务。例如,以下在 new Bitmap() 上失败并出现无效参数异常(请注意,这需要使用 PresentFlag.LockableBackBuffer 创建设备):
Surface surf = m_device.GetRenderTarget(0);
GraphicsStream gs = surf.LockRectangle(LockFlags.ReadOnly);
Bitmap bmp = new Bitmap(gs);
bmp.Save(snapshotName, ImageFormat.Png);
surf.UnlockRectangle();
任何提示将不胜感激......我已经用尽了我能想到的一切(或出现在谷歌上)......