マネージ 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);
問題は、2 のべき乗でない次元のテクスチャをサポートしていない古いビデオ カードでは、上記の方法が失敗することです。いくつかの回避策を試しましたが、任意のサイズのスクリーン キャプチャを保存するというこの一見単純なタスクを達成できるものは何もないようです。たとえば、次の例は 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();
どんなヒントでも大歓迎です...私は考えることができる(またはGoogleに出くわす)すべてを使い果たしました...