Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Graphics32: trotz Runterskalierung größere Datei. Was nu

  Alt 22. Aug 2008, 02:55
Und hier der wahre Grund für diesen Umstand (TBitmap kennt keine Aplhakanäle, es wäre wenn dann Einstellungssache an der PNG-Lib, aber das ist es hier auch nicht):
PNG nutzt eine verlustfreie Kompression, und wird insbesondere durch das Vorhandensein von einfarbigen Flächen in seiner Kompressionsleistung begünstigt. Benutzt man nun zum Verkleinern eines Bildes einen interpolierenden Resamplefilter "bluten" vormals harte Kanten ein klein wenig in diese Flächen hinein, wodurch der "weniger gut zu komprimierende" Flächenanteil im Bild wächst. Gleich große PNG Bilder erzeugen eben auch nicht immer gleich große PNG Dateien, sondern wie bei nahezu allen Kompressionsverfahren ist Bildinhalt mindestens so wichtig wie die Ausmaße.

Paradoxerweise würde JPEG ein auf diese Weise verkleinertes Bild noch kleiner als erwartet bekommen müssen, da dort ein verlustbehaftetes Verfahren zum Einsatz kommt, bei dem grad "weiche" (niederfrequente) Kanten zu einer höheren Kompression führen, so dass o.s. Aussage keinesfalls auf alle komprimierende Verfahren verallgemeinert werden darf. (Das aber nur, damit sich nachher keiner wundert )


Wie kannst du dem Problem bei dir beikommen? Als erstes würde ich schauen was ich da machen will. Bisher riecht das nach einem Remote-Desktop, und du willst Screenshots via Netzwerk/Internet zu einem Client schicken, weshalb diese klein sein sollten. Da sticht einem schon ins Auge, dass sich grad bei der "normalen" Arbeit unter Windows (Office, Adminkrams, etc.) sehr sehr selten in kuzen Abständen das gesamte Bild verändert. Also würde es sich massiv lohnen immer nur je die veränderten Bildbereiche zu schicken, nachdem man nur als erstes Bild einen vollen Screenshot als Basis gesendet hat.
Wie bekomme ich die geänderten von den gleich gebliebenen Bereichen getrennt? Du brauchst die Bilddifferenz, welche nichts weiter ist, als das Resultat aus der Differenz aller Farbwerte aller Pixel zweier aufeinanderfolgender Bilder. Überall wo sich nichts geändert hat hast du darin schwarz. Folglich kannst du alle Pixel in dem zu schickenden Bild einfarbig machen, wodurch du dass was bisher dein Problem ist, nun zur Problemlösung nutzt: Große einfarbige sehr gut komprimierbare Bereiche!
Nun kann es aber sein, dass schwarz auch so auftaucht, weshalb es sich lohnt zusätzlich zu dem via Differenzbild maskiertem und per PNG komprimierten Bild eine 1-Bit-Maske zu schicken, die angibt welche Bereiche im grad geschickten Bild als "neu" zu sehen sind. (Alternativ kann man schwarz auch durch rgb(1,1,1) ersetzen und ganz schwarz als Maske interpretieren, aber das gefällt mir nicht so recht.)
PNG ist da auch schon eine exzellente Wahl, da du diese Maske gleich in das selbe PNG verpacken kannst wie das zugehörige Bitmap, wodurch diese ebenfalls durch die prima Kompression verkleinert wird.


So, jetzt hab ich mir die Finger fusselig geschrieben, und du wirst sicherlich als nächstes antworten, dass du sowas überhaupt nicht vor hattest
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat