2009-06-04 7 views
0

zu übertragen ich brauche schnellsten Weg Bitmap-Objekt über das LAN in C# zu übertragen.Der beste Weg, Bitmap-Objekt über lan

Abdul Khaliq

+2

Könnten Sie bitte das konkretisieren?Ich weiß, ich denke: "zip und mailen Sie das Ding", aber das ist prolly nicht, was Sie hören möchten. – Natrium

+0

Ich habe ein Bitmap-Objekt, sagen wir eine Instanz der Bildschirmaufnahme. Ich muss es über das LAN übertragen. Ich muss wissen, was der schnellste Weg ist, um es über das lan serlizing es zu übertragen oder es im binären Format usw. zu senden? –

Antwort

0

Hier ist ein bug in der .NET V2.0 SP1 und .NET 3.5 Version von CopyFromScreen(). Es leckt einen Griff, nach einer Weile werden Sie verfügbare Handles auslaufen lassen und seltsame Fehlermeldungen wie diese erhalten. Sie können es nicht in seinem gegenwärtigen Zustand verwenden, überprüfen Sie diesen Thread für eine andere Möglichkeit, es durch P/Invoking Windows API-Funktionen auszuführen.

auch gibt es eine nette Lösung gefunden Link.

4

Das Wort „beste“ ist, im besten Fall, ein subjektiver Begriff :-)

Wenn Sie über Geschwindigkeit sprechen sind, dann hängt es davon ab, wie groß die Bitmap ist. Mit einem LAN, das mit 100 Mbps läuft, können Sie etwas ungefähr 1 Sekunde für jede 10MB Datei erwarten. Für eine kleine Datei, übertragen Sie es einfach wie es ist. Bei einer Dateigröße lohnt es sich, die Datei zu komprimieren, zu übertragen und am anderen Ende zu entpacken, einfach weil CPU-Grunt schneller ist als Netzwerk-Grunt.

Aber ich denke, Sie ziemlich große Dateien sprechen würde, um die zusätzliche Codierung lohnt.

Update:

Da Sie über einen Screen-Capture-Rahmen sprechen, lassen Sie uns sagen, dass wir bei 1280x1024, 32bpp sind. Ein Vollbild nimmt dann 5M auf, was in weniger als einer Sekunde auf ein 100Mbps-LAN übertragbar sein sollte (andere Netzwerk-Daten erlauben dies). Es lohnt sich meiner Meinung nach nicht, dies zu beschleunigen, da der Overhead der Komprimierung die Einsparungen in der Zeit aufwiegen würde.

Wenn Sie Video Übertragung tun, das ist eine andere Sache. Dann würden Sie kein brandneues Bild für jeden Frame senden - Sie würden die Deltas ausarbeiten und nur diese Informationen übertragen, basierend auf der Tatsache, dass sich der Bildschirm in der Regel nur ein wenig pro Frame ändert.

Es hängt davon ab, was Sie gehen, um die Bilder zu verwenden. Eine einmalige Bildschirmaufnahme, senden Sie einfach die binäre Information. Sonst noch, du musst uns mehr Details geben.

Für Video-Übertragung, haben wir tatsächlich einige Arbeit auf verschiedenen Komprimierungsverfahren durchgeführt.

Am einfachsten können Sie den Bildschirm in eine (z. B. 16x16) Matrix aufteilen und nur die geänderten Elemente übertragen.

So wird zum Beispiel jeder Rahmen aus einer 256-Bit-Bitmaske bestehen, die anzeigt, welche Elemente sich geändert haben. Auf diese Bitmaske folgen dann die Elemente selbst.

Dieser Algorithmus bedeutet, dass das kleinste Frame-Delta 32 Byte beträgt (wenn der Bildschirm nicht geändert wurde). Der größte ist nur 32 Bytes größer als ein Vollbild-Dump.

Eine der anderen Methoden, die wir verwendeten, bestand darin, einfach die am weitesten links und unten am weitesten rechts liegenden Pixelpositionen zu speichern und diese beiden Werte zusammen mit dem gesamten von ihnen begrenzten Rechteck zu übertragen.

Zweifellos gibt es andere Methoden, die Sie verwenden könnten, sogar die Methode dynamisch auf einer Frame-by-Frame-Basis wählen, um minimale Delta-Größe zu gewährleisten.

+0

das Bitmap-Objekt ist fast 3000 KB groß und ich muss es sehr häufig über das LAN wie Bildschirm erfassen senden. Denken Sie daran, es 11 Bitmap-Objekte in einer Sekunde zu senden. Was ist der schnellste Weg? –

+1

Sehen Sie das Update, Sie sollten nicht die Vollbild-Dump in jedem Rahmen senden. Verwenden Sie Algorithmen, um festzustellen, welcher Teil des Bildschirms sich geändert hat, und senden Sie nur das Delta. – paxdiablo

+0

Nun verwenden wir bereits den Spiegeltreiber, um die Deltas auf dem Bildschirm zu berechnen und Vereinigungen und Schnittpunkte zu verwenden, um die Anzahl der Bitmapobjekte, die über das LAN gesendet werden, weiter zu reduzieren. Das Problem besteht nicht darin, die Deltas zu berechnen, sondern sie effizient über das LAN zu übertragen. –