0

我正在尝试从托管 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();

任何提示将不胜感激......我已经用尽了我能想到的一切(或出现在谷歌上)......

4

1 回答 1

0

为什么不创建一个次幂为 2 的纹理,然后复制一个子矩形?即使保存的图像有大量空白空间,它也会解决您的问题。

我很惊讶位图有问题,tbh。但是..如果是这样的话,那么即使它不理想,上面的方法也会起作用。

于 2010-11-07T21:07:16.163 回答