AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bilder vergleichen unterschiede platzsparend abspeichern
Thema durchsuchen
Ansicht
Themen-Optionen

Bilder vergleichen unterschiede platzsparend abspeichern

Ein Thema von etom291272 · begonnen am 3. Nov 2005 · letzter Beitrag vom 3. Nov 2005
Antwort Antwort
etom291272

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

Bilder vergleichen unterschiede platzsparend abspeichern

  Alt 3. Nov 2005, 09:53

Guten Tag zusammen

mit diesem Code

Delphi-Quellcode:
var
  y, x: integer;
  P, P2: PRGBTriple; // PRGBQuad def. in Unit Windows;
  CountFalsePixel, FirstTickCount: Integer;
  aRect: TRect;
  MemBmp: TBitmap;
begin
  CountFalsePixel := 0;
  FirstTickCount := GetTickCount;
  // 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 RGB(P^.rgbtRed, P^.rgbtGreen, P^.rgbtBlue) <>
        RGB(P2^.rgbtRed, P2^.rgbtGreen, P2^.rgbtBlue) then
      begin
        Inc(CountFalsePixel);
      end;
      Inc(P);
      Inc(P2);
    end;
  end;
   ShowMessage('Das Ausführen dauerte '+IntToStr(GetTickCount - FirstTickCount)+' Ticks'+
              chr(13)+'Unterschiede: '+inttostr(CountFalsePixel));
end;
vergleiche ich recht flott 2 bitmaps (bei grösse 1024 x 768 dauert dass ca 30 ticks) nun möchte ich
die unterschiedlichen pixel mit ihrer information also posx, posy und farbe platzsparend speichern
(stream). Bei meinen bisherigen versuchen wurde der stream bei völlig unterschiedlichen Bildern grösser als dass eigentliche bitmap.

wenn sich das Bild sagen wir um 400000 pixel unterscheidet bei gesamtpixel von 786432 möchte ich mit
10 - 15kb grösse auskommen
ist das möglich
wenn ja wie

Danke für eure Hilfe
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Bilder vergleichen unterschiede platzsparend abspeichern

  Alt 3. Nov 2005, 10:11
Hi,
also ohne jetzt sehr detailiert drüber nachgedacht zu haben, mal zwei Ansätze. Als erstes könntest du (wenig optimiert) einfach eine 1024x768 Matrix anlegen, die an jeder Stelle nur speichert ob sich ein Pixel unterscheidet oder nicht (also boolsch).
Optimaler ist es aber, das ganze als Liste zu verwalten.
Wieder der weniger Platzsparende Weg (aber perfomanter) wäre es, sich einfach ein Array der Größe 768 anzulegen und für jede Zeile Tupel zu speichern. Dabei steht in jedem Tupel das Paar x1, x2 wobei natürlich jede Zeile des Arrays = Zeile deiner Bitmap ist und jedes Tupel die Start- und Endkoordinate der sich unterscheidenden Pixel angibt. Wenn diese benachbart sind, sparst du so schon etwas platz.
Eine optimiertere Möglichkeit was den Platz angeht wäre es dann natürlich nur noch die Zeilen (mit Index der Zeile) zu speichern, die wirklich Pixel enthalten, die sich unterscheiden.

Hm, sollten die aber sehr gut verteilt liegen wird es schwierig deine Grenze einzuhalten. Du hättest ansonsten das Problem, dass eine Bitmatrix (z.B. als gesetzte oder nicht gesetze Bits von 32 Integers pro Zeile) zu einer 768*32*4 Byte Matrix führen würde = ca. 98 KByte (wenn ich mich nicht verrechnet habe.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Bilder vergleichen unterschiede platzsparend abspeichern

  Alt 3. Nov 2005, 10:18
Auch aus der Hüfte geschossen:

1. Bilde die Differenz zwischen dem alten und dem neuen Bild (z.B. einfach die RGB-Werte voneinander abziehen) und speichere das Ergebnis in einem 24-Bit-Stream.
2. Wende auf diesen Stream ein verlustfreies Komprimierungsverfahren an.

Das andere Programm kann dann aus dem alten Bild und den Differenzdaten das neue Bild erstellen. Dort wo die Bilder gleich sind, erhälst du eine lange Kette mit Nullen, die von einer Komprimierung normalerweise fast auf die Länge 0 reduziert werden.

// Noch ein Nachtrag: nicht jeder hat 24-Bit Farbtiefe eingestellt, möglich sind 4, 8, 16, 24 oder 32.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#4

Re: Bilder vergleichen unterschiede platzsparend abspeichern

  Alt 3. Nov 2005, 10:24
Zitat von etom291272:
nun möchte ich die unterschiedlichen pixel mit ihrer information also posx, posy und farbe platzsparend speichern
[...]
wenn sich das Bild sagen wir um 400000 pixel unterscheidet bei gesamtpixel von 786432 möchte ich mit
10 - 15kb grösse auskommen
Selbst wenn es ein Bild mit nur 256 Farben ist, wäre das ein Byte pro Pixel, bei 400000 Pixeln also 400000 Byte ~ 390 kiB. Vielleicht kriegst du das Verlustfrei (Bzip2) auf 15 kiB zusammengeschrumpft, aber bei einem TrueColor-Bild sind es ja schon über 1,5 MiB, die kriegst du bei zufälligen Bilddaten bestimmt nicht auf 15kiB. Und die Rechnung betraf ja nur die Farbwerte, für ein 1024x786-Bild brauchst du für jede x- und y-Koordinate nochmal ein Word, insgesamt für ein 1024*786-TrueColor-Bild also 8 Byte pro Pixel. Du kannst es zwar nach des unwissenden zweiter Methode machen (nur die unterschiedlichen Stripes einer Bitmap-Zeile speichern) machen, das spart deutlich an Speicherplatz für die Pixelkoordinaten, aber wenn du sämtliche Farbwerte verlustfrei unterbringen willst, kriegst du's wahrscheinlcih nicht so klein.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: Bilder vergleichen unterschiede platzsparend abspeichern

  Alt 3. Nov 2005, 10:35
Oh, seh gerade dass ich übersehen habe, dass die Farbe auch gespeichert werden soll, ja das relativiert die Rechnung. Denke mal dein Platzbedarf wird dir gar nicht garantiert werden können, aber auch im Mittel dürfte er deutlich drüber liegen. Die Wahrscheinlichkeit das viele benachbarte Pixel exakt die gleiche Farbe haben ist doch eher gering. Und auch bei guter Kompression dürften 15Kbyte ziemlich wenig sein.
  Mit Zitat antworten Zitat
etom291272

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

Re: Bilder vergleichen unterschiede platzsparend abspeichern

  Alt 3. Nov 2005, 14:34
Zitat:
Selbst wenn es ein Bild mit nur 256 Farben ist, wäre das ein Byte pro Pixel, bei 400000 Pixeln also 400000 Byte ~ 390 kiB. Vielleicht kriegst du das Verlustfrei (Bzip2) auf 15 kiB zusammengeschrumpft,
die idee mit den 256 farben gefällt mir bei meinem test wo sich ca 1/3 des schirms ändert beträgt der stream nur noch 210 kb gezippt dann 8kb

Aber

ich mache noch einen fehler wie ich die farben abspeichere.
ich versuche über scanline einen zeiger auf die linie zu erhalten und lese dann jeden teil des arrays (was ja dann eigentlich das byte sein müsste aus)
Delphi-Quellcode:
P, P2: PByteArray;
...
for x := 0 to Bitm1.Width - 1 do
    begin
      if (P[x] <> P2[x]) then
     begin
        Inc(CountFalsePixel);
        Inc(aLauf);
        Daten[aLauf].Farbe:= P2[x];
...
in daten i sind dann auch werte zwischen 0 und 255 aber ich fürchte dass entspricht nicht der farbe

in anderes bitmap einlesen dann so

Delphi-Quellcode:
  for i:=0 to 200000 do //Length(Daten) -1 do
  begin
    inc(AktSpalte);
    Image2.Picture.Bitmap.Canvas.Pixels[AktZeile,AktSpalte]:=Daten[i].Farbe;
    if AktSpalte = 100 then inc(AktZeile);
    if AktSpalte>100 then AktSpalte:=-1;
  end;
  ShowMessage('fertig'+' Anzahl Items Liste: '+inttostr(ListBox1.Items.Count));
er zeichnet zwar aber nur rot
kann man nur mit einem byte eine farbe bei einem pf8bit bitmap abspeichern
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#7

Re: Bilder vergleichen unterschiede platzsparend abspeichern

  Alt 3. Nov 2005, 17:46
Zitat von etom291272:
gezippt dann 8kb
Wow, das lässt sich ja wesentlich besser komprimieren als ich gedacht hätte

Zitat von etom291272:
er zeichnet zwar aber nur rot
Beinhaltet denn die Bitmap-Instanz der Image-Komponente bei dir ebenfalls ein 8bit-Bitmap, oder ist das auf 32 oder 24 Bit eingestellt?
  Mit Zitat antworten Zitat
etom291272

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

Re: Bilder vergleichen unterschiede platzsparend abspeichern

  Alt 3. Nov 2005, 17:48
ich hatte nicht gecheckt dass wenn ich ein byte abspeichere dass nicht die farbe ist sondern nur ein indexverweis auf die farbtabelle
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:49 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