![]() |
Bilder vergleichen unterschiede platzsparend abspeichern
:-D
Guten Tag zusammen mit diesem Code
Delphi-Quellcode:
vergleiche ich recht flott 2 bitmaps (bei grösse 1024 x 768 dauert dass ca 30 ticks) nun möchte ich
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; 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. :wall: 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 :coder: |
Re: Bilder vergleichen unterschiede platzsparend abspeichern
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 |
Re: Bilder vergleichen unterschiede platzsparend abspeichern
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. |
Re: Bilder vergleichen unterschiede platzsparend abspeichern
Zitat:
|
Re: Bilder vergleichen unterschiede platzsparend abspeichern
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.
|
Re: Bilder vergleichen unterschiede platzsparend abspeichern
Zitat:
Aber :oops: :oops: 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:
in daten i sind dann auch werte zwischen 0 und 255 aber ich fürchte dass entspricht nicht der farbe
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 anderes bitmap einlesen dann so
Delphi-Quellcode:
er zeichnet zwar aber nur rot
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)); kann man nur mit einem byte eine farbe bei einem pf8bit bitmap abspeichern :?: |
Re: Bilder vergleichen unterschiede platzsparend abspeichern
Zitat:
Zitat:
|
Re: Bilder vergleichen unterschiede platzsparend abspeichern
ich hatte nicht gecheckt dass wenn ich ein byte abspeichere dass nicht die farbe ist sondern nur ein indexverweis auf die farbtabelle :oops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 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