AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Differenz zweier Bitmaps speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Differenz zweier Bitmaps speichern

Ein Thema von meisteralex · begonnen am 13. Dez 2005 · letzter Beitrag vom 28. Feb 2007
Antwort Antwort
Seite 1 von 3  1 23      
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#1

Differenz zweier Bitmaps speichern

  Alt 13. Dez 2005, 16:25
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 ???
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#2

Re: Differenz zweier Bitmaps speichern

  Alt 13. Dez 2005, 20:55
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;
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#3

Re: Differenz zweier Bitmaps speichern

  Alt 14. Dez 2005, 06:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: Differenz zweier Bitmaps speichern

  Alt 14. Dez 2005, 08:05
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.
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#5

Re: Differenz zweier Bitmaps speichern

  Alt 14. Dez 2005, 08:15
hört sich gut an, hasst du vielleicht nen beispielcode ??
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#6

Re: Differenz zweier Bitmaps speichern

  Alt 14. Dez 2005, 08:20
@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

@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.
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: Differenz zweier Bitmaps speichern

  Alt 14. Dez 2005, 09:22
@ 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.
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#8

Re: Differenz zweier Bitmaps speichern

  Alt 14. Dez 2005, 10:29
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.
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#9

Re: Differenz zweier Bitmaps speichern

  Alt 14. Dez 2005, 12:28
jetzt versteh ich nur noch bahhof *g*
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#10

Re: Differenz zweier Bitmaps speichern

  Alt 14. Dez 2005, 14:47
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 `?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 Uhr.
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