Schnellste Weg zu ziehen, eine Reihe von Bitmaps mit C#

Ich Baue eine Anwendung, die video-frames von einer Kamera (30fps @ 640 x 480), verarbeitet diese und zeigt Sie auf einem Windows Form. Ich war zunächst mit der Methode DrawImage (siehe code unten), aber die Leistung war schrecklich. Auch mit der Verarbeitung von Schritt deaktiviert, die beste, die ich bekommen kann, ist, 20fps auf einem 2,8-GHz-Core-2-Duo-Maschine. Die Doppelpufferung aktiviert ist auf dem Windows-Formular sonst bekomme ich tearing.

Hinweis: Das Bild ist ein Bitmap-format Format24bppRgb. Ich weiß, dass DrawImage soll schneller sein, eine Format32bppArgb formatierte Bild, aber ich bin beschränkt durch das format kommt aus den frame-grabber.

private void CameraViewForm_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;

    //Maximize performance
    g.CompositingMode = CompositingMode.SourceOver;
    g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
    g.CompositingQuality = CompositingQuality.HighSpeed;
    g.InterpolationMode = InterpolationMode.NearestNeighbor;
    g.SmoothingMode = SmoothingMode.None;

    g.DrawImage(currentFrame, displayRectangle);
}

Versuchte ich mit Managed DirectX 9 mit Texturen und Spites (siehe unten), aber die Leistung war noch schlechter. Ich bin sehr neu in DirectX-Programmierung, so dass dies möglicherweise nicht die beste DirectX-code.

private void CameraViewForm_Paint(object sender, PaintEventArgs e)
{
    device.Clear(ClearFlags.Target, Color.Black, 1.0f, 0);

    device.BeginScene();

    Texture texture = new Texture(device, currentFrame, Usage.None, Pool.Managed);
    Rectangle textureSize;

    using (Surface surface = texture.GetSurfaceLevel(0))
    {
        SurfaceDescription surfaceDescription = surface.Description;
        textureSize = new Rectangle(0, 0, surfaceDescription.Width, surfaceDescription.Height);
    }
    Sprite sprite = new Sprite(device);

    sprite.Begin(SpriteFlags.None);
    sprite.Draw(texture, textureSize, new Vector3(0, 0, 0), new Vector3(0, 0, 0), Color.White);
    sprite.End();

    device.EndScene();

    device.Present();

    sprite.Dispose();
    texture.Dispose();
}

Ich brauche dies funktioniert auf XP, Vista und Windows 7. Ich weiß nicht, ob es einen Versuch Wert XNA und OpenGL. Dies scheint, wie es sollte eine sehr einfache Sache zu erreichen.

  • Die meisten von den capture-Schnittstellen haben "Vorschau" - Funktion, die einen direkten Anschluss an Fenster-handle und dann Malt, ohne jede Hektik. Wenn Sie nicht über diese option, sind Sie in der Lage, Tauchen Sie ein in DirectShow - wenn ja, hätte ich vielleicht eine Antwort für Sie.
InformationsquelleAutor sanger | 2010-10-01
Schreibe einen Kommentar