Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Differenz zweier Bitmaps speichern (https://www.delphipraxis.net/58849-differenz-zweier-bitmaps-speichern.html)

meisteralex 13. Dez 2005 16:25


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 ???

etom291272 13. Dez 2005 20:55

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;

meisteralex 14. Dez 2005 06:57

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.

MarcoWarm 14. Dez 2005 08:05

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.

meisteralex 14. Dez 2005 08:15

Re: Differenz zweier Bitmaps speichern
 
hört sich gut an, hasst du vielleicht nen beispielcode ??

etom291272 14. Dez 2005 08:20

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.

MarcoWarm 14. Dez 2005 09:22

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.

Cicaro 14. Dez 2005 10:29

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:
// 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
gehen.
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.

meisteralex 14. Dez 2005 12:28

Re: Differenz zweier Bitmaps speichern
 
jetzt versteh ich nur noch bahhof *g*

meisteralex 14. Dez 2005 14:47

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 19:25 Uhr.
Seite 1 von 3  1 23      

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