none
Control C# XNA distorsiona imagen con diferentes ratios de aspecto

    Pregunta

  • Hola.

    Estoy trabajando en un control de C# que muestra el video de una cámara adjunta a un posicionador (PTZ). Si el aspecto (ancho / alto) del control es el mismo que el de la fuente de video funciona perfectamente pero cuando el PTZ se está moviendo Y el aspecto del video es diferente al del control las líneas verticales empiezan a ondular en vez de mantenerse rectas, cuando el PTZ se detiene estas dejan de ondular.

    Por ejemplo, si el tamaño del control es de 400x300 y la fuente emite a 704x576 cuando el PTZ se mueve las líneas verticales ondean, si el PTZ no se mueve el video se ve bien. Si el tamaño del control es de 352x288 y la fuente emite a 704x576 el video se ve correctamente, tanto si el PTZ se está moviendo como si no.

    //
    // init
    //
    OnCreateControl()
    {
    PresentationParameters parameters = new PresentationParameters();

    parameters.BackBufferWidth = Math.Max(width, 1);
    parameters.BackBufferHeight = Math.Max(height, 1);
    parameters.BackBufferFormat = SurfaceFormat.Color;
    parameters.DepthStencilFormat = DepthFormat.Depth24;
    parameters.DeviceWindowHandle = windowHandle;
    parameters.PresentationInterval = PresentInterval.One;
    parameters.IsFullScreen = false;
    parameters.MultiSampleCount = 4;

    graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.Reach, parameters);

    spriteBatch = new SpriteBatch(graphicsDevice);
    texture = new Texture2D(graphicsDevice, 320, 240, false, SurfaceFormat.Color); // first texture size, unknown resolution yet
    }

    //
    // painting
    //
    OnPaint()
    {
    Viewport viewport = new Viewport();
    viewport.X = 0;
    viewport.Y = 0;
    viewport.Width = ClientSize.Width;
    viewport.Height = ClientSize.Height;
    viewport.MinDepth = 0;
    viewport.MaxDepth = 1;

    GraphicsDevice.Viewport = viewport;

    GraphicsDevice.Textures[0] = null;

    if (FrameLock.TryEnterReadLock(20))
    {
        if (Updated)
        {
            if (image_width != texture.Width || image_height != texture.Height)
                texture = new Texture2D(graphicsDevice, image_width, image_height, false, SurfaceFormat.Color);
            texture.SetData<byte>(buffer, 0, buffer.Length);
            Updated = false;
        }

      FrameLock.ExitReadLock();
    }

    Microsoft.Xna.Framework.Rectangle destinationRectangle = new Microsoft.Xna.Framework.Rectangle(0, 0, graphicsDevice.Viewport.Width, graphicsDevice.Viewport.Height);
    Microsoft.Xna.Framework.Rectangle sourceRectangle = new Microsoft.Xna.Framework.Rectangle(0, 0, image_width, image_height);     
        
    graphicsDevice.Clear(new Microsoft.Xna.Framework.Color(0, 0, 0, 0));
    spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise, null);
    spriteBatch.Draw(texture, destinationRectangle, sourceRectangle, Microsoft.Xna.Framework.Color.White);
    spriteBatch.End();

    Microsoft.Xna.Framework.Rectangle sourceRectangle = new Microsoft.Xna.Framework.Rectangle(0, 0, ClientSize.Width, ClientSize.Height);

    GraphicsDevice.Present(sourceRectangle, null, this.Handle);
    }

    //
    // handling device reset
    //
    HandleDeviceReset()
    {
    bool deviceNeedsReset = false;

    switch (graphicsDevice.GraphicsDeviceStatus)
    {
        case GraphicsDeviceStatus.NotReset:
            deviceNeedsReset = true;
            break;
        default:
            // If the device state is ok, check whether it is big enough.
            PresentationParameters pp = GraphicsDevice.PresentationParameters;

            deviceNeedsReset = (ClientSize.Width > pp.BackBufferWidth) ||
                               (ClientSize.Height > pp.BackBufferHeight);
            break;
    }

    // Do we need to reset the device?
    if (deviceNeedsReset)
    {
        try
        {
            graphicsDeviceService.ResetDevice(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
        }
        catch
        {
        }
    }
    }

    ¿A qué se debe este fenómeno y como podría evitarlo? Gracias de antemano.




    • Editado marranxo miércoles, 31 de mayo de 2017 10:58
    lunes, 29 de mayo de 2017 11:21