Я пытаюсь сделать снимок экрана из приложения Managed 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);
Проблема заключается в том, что на старых видеокартах, которыене поддерживает размерные текстуры не-степени двух, вышеприведенный сбой.Я пробовал несколько обходных путей, но, кажется, ничто не решает эту, казалось бы, простую задачу сохранения снимков экрана произвольного размера.Например, следующее не работает в новом 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) ...