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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die Antwort direkt vor Ihnen. Dies ist eine späte Antwort auf eine alte Frage, aber könnte jemand brauchen, die Antwort so...
Statt zu deklarieren, neue Texturen und Rechtecken in Ihrem draw-Schleife (die ist ziemlich intensiv auf die Ressourcen), warum nicht erstellen eine textur, die außerhalb des Bereichs? Anstelle von Ihr, zum Beispiel, versuchen Sie dies:
dann, wenn Sie brauchen, um zu initiieren, mehrere Texturen, tun Sie es in eine Liste, dann malen Sie aus, die Liste. Es spart Ressourcen dann frei Ihnen jede Farbe.
Ist CameraViewForm Ihre gesamte viewer-Fenster? Wenn ja, dann auf Paint das ganze Fenster neu gezeichnet wird, mit allen Schaltflächen, Fortschrittsbalken, etc. Dies wird mehr oder weniger teuer, je nach der Anzahl der Steuerelemente auf dem Formular, und der visual doo-Väter, die Sie aktiviert haben für die desktop-Elemente in verschiedenen Betriebssystemen (z.B. Fenster-bar, Transparenz).
Versuchen, single-buffering die ganze form, gibt dem Panel (von dem ich angenommen, Sie bekommen displayRectangle) seine eigenen BufferedGraphicsContext, indem er erklärt, eine neue, wenn Sie anrufen GreateGraphics() oder vor dem Aufruf von Invalidate() auf dem Bedienfeld. Dies ermöglicht es der Jury, die double-buffered getrennt von der Form.