Сохранение снимка экрана без учета pow-2 в Managed DirectX - PullRequest
0 голосов
/ 07 ноября 2010

Я пытаюсь сделать снимок экрана из приложения 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) ...

1 Ответ

0 голосов
/ 08 ноября 2010

Почему бы не создать текстуру, которая будет следующей по величине степени 2, а затем скопировать подстроку? Это решит ваши проблемы, даже если в сохраненном изображении будет много пустого пространства.

Я удивлен, что у Bitmap есть проблемы, tbh. Однако ... если это так, то вышесказанное будет работать, даже если это не идеально.

...