Zitat von
Christian18:
ein bild von desktop zu erstellen und dann über das netzwerk zu verschicken ist nicht sonderlich schwer, dass habe ich auch schon geschafft.
Dazu gehört ja auch nicht viel.
Der Fragesteller wollte ja gar nicht wissen, wie man Bildchen verschickt, sondern wie er z.B. Bildverändungen kompakter darstellen kann...
Ich würde vielleicht gar keine starre PNG nehmen, sondern auch mal mit RLE experimentieren (in Abhängigkeit der Veränderungen). RLE dürfte bei weitgehend einfarbigen Bildern vielleicht noch besser komprimieren.
Wenn Du also die Differenz zweier Bilder dadurch darstellst, das das Differenzbild an den Stellen, wo sich Nichts verändert, z.B. schwarz ist, dann versuche doch mal Folgendes:
Merke Dir beim Vergleich das obere linke (P1) sowie das untere rechte Pixel (P2), das verändert wurde. Das Differenzbild ist nun nicht mehr genauso gross, wie das Bild selbst, sondern umfasst nur den Teil zwischen P1 und P2. Normalerweise verändert sich ja nur ein Rechteck (Fenster/Menü geht auf/zu, Progressbar bewegt sich).
Bei deinen Tests (1 Pixel differenz) ist dann das Differenzbild genau 1x1 Pixel gross, also wesentlich weniger als 2kb. Du überträgst dann P1 sowie das Differenzbild. Bei normalen Änderungen (wenn ich z.B. hier tippe), verändert sich doch auch nur ein ca. 20x20 pixel großes Bild! Wenn Du dann noch die Farbtiefe dieses Minibildes heruntersetzt (das hat doch selten mehr als 5 Farben), dann wird das nochmal richtig klein eingedampft.
Nun kann man das noch weiter treiben, und vielleicht mehrere Subbilder erstellen: Wenn sich nun z.B. 4 Pixel verändert haben, die aber weit auseinander liegen, würde mit dem o.g. Verfahren ein ziemlich grosses Differenzbild erstellt werden, das die 4 Pixel umspannt. Es kann aber besser sein, hier 4 Subbilder mit 4 Offsets zu erstellen. Ich kann mir vorstellen, das die Entscheidung, ob man ein Differenzbild noch weiter unterteilt, oder nicht, sehr interessant ist. Soweit ich weiss, wäre das eine wirkliche Innovation!
Hooks sind übrigens ein Mittel von Windows, um z.B. Mausbewegungen, Tastendrücke etc. 'abzufangen'. Ein Hook sieht immer so aus:
Delphi-Quellcode:
Procedure MyIrgendwassHook (Msg : TMessage; NextProc : THookProc);
Begin
If ShouldHandleMessage (Msg) Then
HandleMessage(Msg);
NextProc (Msg)
End;
Natürlich stimmen die Parameter nicht. Im Prinzip 'hängst' (eng: to hook) Du deine Routine in eine Kette von Behandlungsroutinen rein. Das vorherige Glied der Kette ruft deine Routine auf. Du machst irgendwas mit der Message und rufst dann AUF JEDEN FALL (so die Regel) das nächste Glied der Kette auf.
Ich kenne RDC nicht, aber eine andere Möglichkeit, Änderungen des Bildschirmes zu übertragen, wäre, den Windows-Befehl (also 'ShowWindow', 'MoveWindow', SetMouse etc...) anstatt den Pixeln zu übertragen. Das kann wesentlich schneller gehen, solange Windows-eigene Fensterklassen, also klassische buttons, labels, forms, listviews etc. verwendet werden.
Und JPG verwendet VNC vielleicht deshalb, weil VNC einfach ziemlich alt ist und es PNG damals nicht gab. Vielleicht, weil das nur ne Vermutung ist. Nebenbei verwendet das ursprüngliche VNC doch kein JPG, sondern ein verlustfreies Verfahren (GIF?). Einzelne VNC-Derivate komprimieren jedoch verlustbehaftet, das sieht doch dann aber blöd aus. Ich nehme beim remote controlling (mach ich täglich mehrere Stunden) lieber weniger Farben in Kauf, als mich mit diesen JPG-Artefakten rumzuschlagen.