![]() |
Differenz zweier Bitmaps speichern
Guten Tag :-)
Ich bin zur Zeit ein VNC-ähnliches Programm am proggen und wollte euch mal nach Rat fragen: Es soll so funktionieren, dass ich die Bildschirme capture, als Bitmap speicher, die Differenz zur vorherigen aufgezeichneten Bitmap erreichen, diese mit Huffmann+LZW komprimiere und dann übertrage. Im Moment steck ich ganz am Anfang und suche nach einem optimiertem Verfahren um 2 Bitmaps miteinander zu vergleichen und die Differenz zu speichern. Das Verfahren sollte zimich schnell sein. Hat jemand eine Idee ??? |
Re: Differenz zweier Bitmaps speichern
ich hab vor kurzem so ein remote tool mit delphi realisiert. ich sag dir gleich du nimmst dir einiges vor. warum willst du das selber schreiben?
ich habs genau so gemacht allerdings unterteile ich den schirm in 8 horizontale zonen und frage jede zone einzeln ab und übertrage dann die differenz (trotzdem bei isdn ätzend langsam). mit dieser methode kannst du die anzahl der unterschiedlichen pyxel in 2 bitmaps feststellen
Delphi-Quellcode:
function TMainFormClient.BitmUnterschVorh(Bitm1, Bitm2:TBitmap):Boolean;
var y, x: integer; P, P2: PByteArray; // PRGBTriple; // PRGBQuad def. in Unit Windows; CountFalsePixel: Integer; aRect: TRect; begin aRect := Rect(65000, 65000, 0, 0); CountFalsePixel := 0; // Bitmaps vergleichen for y := 0 to Bitm1.Height - 1 do begin P := Bitm1.ScanLine[y]; P2 := Bitm2.ScanLine[y]; for x := 0 to Bitm1.Width - 1 do begin if (P[x] <> P2[x]) then begin Inc(CountFalsePixel); begin if x < aRect.Left then aRect.Left := x; if y < aRect.Top then aRect.Top := y; if x > aRect.Right then aRect.Right := x; if y > aRect.Bottom then aRect.Bottom := y; end;//rect end;//Unterschied end;//xlauf end;//y lauf {ShowMessage('Das Ausführen dauerte '+IntToStr(GetTickCount - FirstTickCount)+' Ticks'+ chr(13)+'Unterschiede: '+inttostr(CountFalsePixel)+chr(13)+ 'Anzahl Items Liste: '+inttostr(ListBox1.Items.Count));} if CountFalsePixel>0 then result:=True else Result:=False; end; |
Re: Differenz zweier Bitmaps speichern
wenn das so ätzend langsam ist, wie schafft es dann vnc ?
ich mein die können doch auch nicht zaubern. kennt jemand das prizip von denen?? hab jetzt keine lust, mir den quellcode anzugucken, weiß nur das die mit jpeg kompression arbeiten. |
Re: Differenz zweier Bitmaps speichern
Ich wandle die Bilder vor dem Versenden in PNGs um ... Das bedeutet zwar ein bissl mehr Prozessorlast auf dem "überwachten" Rechner ... aber beim "Überwacher" kommen kleine Bildpackete an, die auch noch ordentlich aussehen (nicht wie bei JPEG). Ausserdem kann man ja PNG nur die wirklich sichtbaren Daten übertragen (alles andere wird einfach Transparent). Desweiteren werden bei mir nur Daten übertragen, wenn sich mehr Bildpunkte ändern, als in einem userdefinierten Schwellenwert definiert.
|
Re: Differenz zweier Bitmaps speichern
hört sich gut an, hasst du vielleicht nen beispielcode ??
|
Re: Differenz zweier Bitmaps speichern
@marco warm
wie gross sind den bei dir dann die datenpakete wenn ein teil des Bildschirms neu aufgebaut wird. bei meiner horizontal split methode sind die zu übertragenden pakete teilweise nur 5kb gross aber bei 8 bildteilen können da schon auch mal 80 -100 kb zusammenkommen und dann bei isdn :kotz: @all ich glaube nicht dass die gängigen remote prgs bildteile des zu wartenden pc's herumschicken dass muss irgenwie anders gehen. ganz zu schweigen von der rdp technologie bzw citrix (geht ja fast in echtzeit bei isdn) hab auch schon im netz intensiv gestöbert wie das bei terminalserver gelöst ist habe aber nichts konkretes gefunden. mein prg läuft jetzt zwar durchaus zufriedenstellend bei >=128k upload des zu wartenden netzwerks bin aber sehr interessiert daran dass Verfahren zu beschleunigen. |
Re: Differenz zweier Bitmaps speichern
@ etom
typische Packetgrößen bei einer "Beobachtung" eines unserer User im Adobe Illustrator: - ganzer Bildschirm (1280x1024) ... Das Bild wird aller 30 Bilder als neues "Schlüsselbild" gepollt: ca 36 kb - Dateimenü öffnen 1,26 kb ... mist, jetzt hat sie das Programm gewechselt lol - Textverarbeitung blinkender Cursor 0,83kb - rumnavigieren mit dem Explorer 1-3 kb es kann eigentlich nur so gehen, daß Bildteile verschickt werden. Ich denke Citrix benutzt ein sehr intelligentes Komprimierungs und Bitmap-Caching Verfahren. |
Re: Differenz zweier Bitmaps speichern
Also zum Thema Bildvergleich und ähnliches kommt mir ersteinmal die Idee, die beiden Bitmaps mit Hilfe der API-Funktion BitBlt() zu verknüpfen.
Wenn man die DCs der Bitmaps hat, sollte man mit der richtigen AND-OR-NOT-Technik die Differenz der beiden Bitmaps erhalten können. Spontan würde ich sagen, es müsste mit
Delphi-Quellcode:
gehen.
// DC1 von Bitmap1, DC2 von Bitmap2
(DC1 or DC2) // entspricht BitBlt(DC1,0,0,Width1,Height1,DC2,0,0,SRCPAINT); ( DC1 and ( not ( DC1 and DC2 )) // vorgeschlagene Lösung Wenn ich mit dem Code Recht hab' ist die Berechnung des Bildunterschiedes in dem Fall rasant. Wichtig: man sollte die passenden Bildverknüpfungskonstanten - wie SRCPAINT für OR - aus der Delphi-Hilfe heraussuchen. |
Re: Differenz zweier Bitmaps speichern
jetzt versteh ich nur noch bahhof *g*
|
Re: Differenz zweier Bitmaps speichern
hat sich jemand von euch schonmal gedanken darüber gemacht ein remote - tool zu schreiben welches anders arbeitet als nach der bildschirmabfotografier-methode. rdc von ms macht das ja auch irgendwie und netop kann soweit ich weiß auch den bildschirminhalt anhand von Windows-Aufrufe übertragen..
Hat irgendjemand ne Idee wie das Funktionieren könnte `? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz