Redimensionando um recurso DXGI ou Texture2D no SharpDX
Desejo redimensionar uma tela capturada usando a API de duplicação de área de trabalho no SharpDX. Estou usando oCódigo de exemplo do Screen Capture do repositório SharpDX Samples, parte relevante a seguir:
SharpDX.DXGI.Resource screenResource;
OutputDuplicateFrameInformation duplicateFrameInformation;
// Try to get duplicated frame within given time
duplicatedOutput.AcquireNextFrame(10000, out duplicateFrameInformation, out screenResource);
if (i > 0)
{
// copy resource into memory that can be accessed by the CPU
using (var screenTexture2D = screenResource.QueryInterface<Texture2D>())
device.ImmediateContext.CopyResource(screenTexture2D, screenTexture);
// Get the desktop capture texture
var mapSource = device.ImmediateContext.MapSubresource(screenTexture, 0, MapMode.Read, MapFlags.None);
System.Diagnostics.Debug.WriteLine(watch.Elapsed);
// Create Drawing.Bitmap
var bitmap = new System.Drawing.Bitmap(width, height, PixelFormat.Format32bppArgb);
var boundsRect = new System.Drawing.Rectangle(0, 0, width, height);
// Copy pixels from screen capture Texture to GDI bitmap
var mapDest = bitmap.LockBits(boundsRect, ImageLockMode.WriteOnly, bitmap.PixelFormat);
var sourcePtr = mapSource.DataPointer;
var destPtr = mapDest.Scan0;
for (int y = 0; y < height; y++)
{
// Iterate and write to bitmap...
Gostaria de redimensionar a imagem muito menor que o tamanho real da tela antes de processá-la como uma matriz de bytes. Não preciso salvar a imagem, é só pegar os bytes. Gostaria de fazer isso de forma relativamente rápida e eficiente (por exemplo, aproveitando a GPU, se possível).
Não consigo escalar duranteCopyResource
, pois as dimensões de saída precisam ser as mesmas que as dimensões de entrada. Posso fazer outra cópia do meuscreenTexture2D
escalar? Como exatamente dimensiono o recurso - eu uso uma Cadeia de Trocas, uma transformação Matrix ou outra coisa?