Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Remote Screenshots, aber nur die geänderten Teile (https://www.delphipraxis.net/81764-remote-screenshots-aber-nur-die-geaenderten-teile.html)

Zacherl 3. Dez 2006 13:32


Remote Screenshots, aber nur die geänderten Teile
 
Hi,

wie kann ich ein Remote Screenshot Programm realisieren, was aber nur jeweils die Änderungen neu überträgt? Geht das mit dem PNG Format? Weil ich habe da mal was gelesen, dass das möglich wäre.

Florian

DGL-luke 3. Dez 2006 14:47

Re: Remote Screenshots, aber nur die geänderten Teile
 
Screenshot machen -> übertragen -> Neuen screenshot -> Differenzbild -> alles was gleichgeblieben ist, ist jetzt schwarz -> mit PNG komprimieren: große gleichfarbige flächen werden sehr klein -> übertragen -> wieder zusammenrechnen.

Zacherl 3. Dez 2006 15:11

Re: Remote Screenshots, aber nur die geänderten Teile
 
Cool, danke ... hast du evtl einen Beispielcode fürs Erstellen von Differenzbildern und das Zusammenrechnen?

Jan 3. Dez 2006 16:16

Re: Remote Screenshots, aber nur die geänderten Teile
 
Für's Differenzbild einfach nur die Pixel paarweise subtrahieren (RGBA getrennt behandeln). Das Ergebnis dann in ein neues Bild schreiben. Bild muss hier nicht unbedingt ein Bild in diesem Sinne sein, sondern einfach ein array von byte triplets (oder quadrupels) wenn du mit alpha-Kanal arbeitest, da du durch die Subtraktion auch negative Werte erhalten kannst, die ja in einem Bild eher nicht vorkommen.
-Jan-

DGL-luke 3. Dez 2006 18:40

Re: Remote Screenshots, aber nur die geänderten Teile
 
Ja äh...

ich hätts - in meiner grandiosen booleschen unbedarftheit - halt so gemacht:

Delphi-Quellcode:
var
  Old, New, Result: TBitmap;
  Alpha: Array of Boolean;
  PtrOld, PrtNew: Pointer;
  x,y: Integer;
begin
  for y := 0 to Old.Height-1 do
  begin
    ptrOld := Old.Scanline[y];
    ptrNew := New.Scanline[y];
    for x := 0 to Old.Width-1 do
    begin
      if TColor(PtrOld^) = TColor(PtrNew^) then
      begin
        Alpha[x,y] := 0;
        Result.Pixels[x,y] := clBlack; //war zu faul da noch mal rumscanzulinen.... sollte man aber! Bringt einiges an Performance!
      end
      else
      begin
        Alpha[x,y] := 1;
        Result.Pixels[x,y] := TColor(PtrNew^);
      end;
     
      Inc(PtrOld);
      Inc(PtrNew);
    end;
  end;
end;
du kannst dann aus der Alphamaske und den Farbwerten ein PNG-Bild machen.

Zacherl 3. Dez 2006 19:41

Re: Remote Screenshots, aber nur die geänderten Teile
 
Vielen Dank ... aber man könnte es theoretisch auch so machen, oder?

Delphi-Quellcode:
Image2.picture.bitmap.Canvas.CopyMode := SRCINVERT;
with Image2.picture.bitmap.canvas do
  CopyRect(ClipRect,Image1.picture.bitmap.Canvas,Image1.picture.bitmap.Canvas.ClipRect);
Florian

Jan 3. Dez 2006 19:42

Re: Remote Screenshots, aber nur die geänderten Teile
 
Vom Prinzip her ähnlich, ABER: so wie ich das mitbekommen habe geht es um Remote-Übertragung des Bildschirminhaltes. Das bedeutet, dass Komprimierung hier eine Rolle spielen wird.
Komprimierung ist dann besonders effizient, wenn es viel Redundanz im den zu komprimierenden Informationne gibt. Wenn ich jetzt also einfach mal annehme, dass mein Bild heller geworden ist, aber sonst nicht viel passiert ist, dann bedeutet das, dass ich in der Differenz der beiden Bilder einen konstanten Wert erhalten werde. Dieser Wert lässt sich dann sehr effizient komprimieren. Wenn ich allerdings in mein Differenzbild einfach jeden veränderten Pixel reinschreibe, dann kann ich da große Wertespannen haben, die bei der Komprimierung stark ins Gewicht fallen.
Daher würde ich mal sagen, dass das Ganze mit dem einfachen Trick der Subtraktion effizienzsteigernd bei der Datenmenge wirkt.
Gruß
Jan

jfheins 3. Dez 2006 20:12

Re: Remote Screenshots, aber nur die geänderten Teile
 
Ich würde es einfach mit einem xor für alle Pixel lösen, da sich zum einen selten der gesamte Bildschirm ändert und zum anderen das relativ schnell ist (im vergleich zu Luke's Lösung mit den richigen Farbwerten)

Man kann dann einfach (geht vll. sogar mit bitblt) das "xor-bild" machen - alle gleeichgebliebenen Regionen werden schwarz - und das dann entsprechend komprimieren.

Zacherl 3. Dez 2006 22:01

Re: Remote Screenshots, aber nur die geänderten Teile
 
Okey, dann danke euch allen.

Mackhack 4. Dez 2006 04:23

Re: Remote Screenshots, aber nur die geänderten Teile
 
Du koenntest auch den gesamten Bildschirm in ein Raster stecken. Vlt. 8x8 oder 16x16 oder 32x32 z. B. Dann hast du ja nur noch gewisse "Felder" die du abgleichen und verschicken musst!

Vlt. hilft das auch!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz