AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PNG komprimieren

Ein Thema von Rolf Frei · begonnen am 23. Okt 2018 · letzter Beitrag vom 24. Okt 2018
Antwort Antwort
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: PNG komprimieren

  Alt 23. Okt 2018, 17:50
Du musst halt zunächst mal einen Farbreduzierungsalgorithmus implementieren. Bekannte Verfahren sind Octree und Median-Schnitt. Das Median-Schnitt-Verfahren ist selbst dann verlustbehaftet, wenn das Ausgangsbild bereits weniger Farben als angegeben hat. Diese Verfahren werden zudem oft mit einem Dithering-Algorithmus (auch Fehlerdiffusion genannt) kombiniert, am bekanntesten sind Floyd-Steinberg und Stucki. Dithering erhöht die Dateigröße stark.
Ja aber genau hier liegt ja der Hund begraben. Ich habe keine Ahnung wie man das macht. Bei meinem 3. Link zum C# Algorythmus wäre ja was dabei, aber ich verstehe da nur Bahnhof und weiss überhaupt nicht wie ich das nun in Delphi umgesetzt bekomme.

http://www.hurryupandwait.io/blog/co...it-pngs-with-c

Habe eigentlich gehofft, dass jemand das Problem bereits mal gelöst hat. Dass da in der Delphi Welt noch niemand mit dem selben Problem konfrontiert war, kann ich mir garnicht so recht vorstellen. Oder es ist einfach noch nicht so recht bekannt, dass man mit PNG und entsprechender Optimierung auch sehr kleine PNG Dateien erzeugen kann.

PS. Photoshop unterstützt diese Format übrigens auch und man kann da auch 8 bit PNG speichern.

Geändert von Rolf Frei (23. Okt 2018 um 18:03 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: PNG komprimieren

  Alt 24. Okt 2018, 08:20
Du musst halt zunächst mal einen Farbreduzierungsalgorithmus implementieren. Bekannte Verfahren sind Octree und Median-Schnitt. Das Median-Schnitt-Verfahren ist selbst dann verlustbehaftet, wenn das Ausgangsbild bereits weniger Farben als angegeben hat. Diese Verfahren werden zudem oft mit einem Dithering-Algorithmus (auch Fehlerdiffusion genannt) kombiniert, am bekanntesten sind Floyd-Steinberg und Stucki. Dithering erhöht die Dateigröße stark.
Ja aber genau hier liegt ja der Hund begraben. Ich habe keine Ahnung wie man das macht. Bei meinem 3. Link zum C# Algorythmus wäre ja was dabei, aber ich verstehe da nur Bahnhof und weiss überhaupt nicht wie ich das nun in Delphi umgesetzt bekomme.

http://www.hurryupandwait.io/blog/co...it-pngs-with-c
Hast du (oder irgendwer der sich hier Beteiligten) denn überhaupt den GESAMTEN Blogpost gelesen?
Lade dir doch einfach die Visual Studio Community runter, hole dir den nQuant Quelltext, kompiliere und builde das Kommandozeilentool und rufe es in deinen Programm (oder sonst wie) auf.

https://code.msdn.microsoft.com/Conv...bit%20PNGs.zip

Wenn ganz viel Zeit da ist, kannst du die 632 Zeilen der WuQuantizer.cs (also da wo die ganze Magie passiert) auch nach Delphi übersetzen.
Delphi bringt auch eine GDI+ Kapselung mit. Damit kannst du die verwendeten Objekte von System.Drawing und System.Drawing.Imaging substituieren.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: PNG komprimieren

  Alt 24. Okt 2018, 11:07
Hast du (oder irgendwer der sich hier Beteiligten) denn überhaupt den GESAMTEN Blogpost gelesen?
Lade dir doch einfach die Visual Studio Community runter, hole dir den nQuant Quelltext, kompiliere und builde das Kommandozeilentool und rufe es in deinen Programm (oder sonst wie) auf.

https://code.msdn.microsoft.com/Conv...bit%20PNGs.zip

Wenn ganz viel Zeit da ist, kannst du die 632 Zeilen der WuQuantizer.cs (also da wo die ganze Magie passiert) auch nach Delphi übersetzen.
Delphi bringt auch eine GDI+ Kapselung mit. Damit kannst du die verwendeten Objekte von System.Drawing und System.Drawing.Imaging substituieren.
Aber dann wäre ich doch genau da wo ich jetzt schon bin. Lies du mal meinen ersten Post durch

pngquant.exe (https://pngquant.org/) macht ja genau das was ich will nur würde ich eben gerne dieses externe Tool eliminieren und alles in Delphi machen. pngquant ist hervorragend und produziert super Qualität. Wenn das mit Delphi nicht einfach umsetzbar ist, werde ich halt gezwungen sein, das Tool weiterhin zu nutzen.

@KodeZwerg
Das ist doch schon mal ein guter Anfang. Bin gespannt ob du das noch besser hinkriegst.

Geändert von Rolf Frei (24. Okt 2018 um 11:49 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: PNG komprimieren

  Alt 24. Okt 2018, 11:30
Aber dann wäre ich doch genau da wo ich jetzt schon bin. Lies du mal meinen ersten Post durch
Ah, ja! Mir war so, als ob du eine externe Webanwendung ersetzen wolltest.

Warum willst du denn das externe Tool ersetzen? Wer bezahlt dir denn diese Zeit?
Es ist doch schon fertig (mehrfach!) als kleine Kommandozeilen-Exe verfügbar.
Du hast von vielen Seiten Beispiele für einen solchen Algorithmus.
Wobei sollen wir dir helfen? Hunderte Zeilen C, C++ oder C#-Quelltext zu lesen und nach Delphi zu portieren?
Was hast du schon an Vorarbeit geleistet?`

Der von mir verlinkte C#-Quelltext sollte am Einfachsten nach Delphi zu portieren sein.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: PNG komprimieren

  Alt 24. Okt 2018, 11:56
Aber dann wäre ich doch genau da wo ich jetzt schon bin. Lies du mal meinen ersten Post durch
Ah, ja! Mir war so, als ob du eine externe Webanwendung ersetzen wolltest.

Warum willst du denn das externe Tool ersetzen? Wer bezahlt dir denn diese Zeit?
Es ist doch schon fertig (mehrfach!) als kleine Kommandozeilen-Exe verfügbar.
Du hast von vielen Seiten Beispiele für einen solchen Algorithmus.
Wobei sollen wir dir helfen? Hunderte Zeilen C, C++ oder C#-Quelltext zu lesen und nach Delphi zu portieren?
Was hast du schon an Vorarbeit geleistet?`

Der von mir verlinkte C#-Quelltext sollte am Einfachsten nach Delphi zu portieren sein.
Eigentlich hatte ich einfach gehofft, dass jemand das Problem selber schon gelöst hat oder eine Delphi Library kennt, die das kann. Mit der Protierung des C# Codes habe ich Probleme, da mir der Sprache C# nicht so geläufig ist. Werde es aber mal genauer anschauen.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: PNG komprimieren

  Alt 24. Okt 2018, 12:18
Mit der Protierung des C# Codes habe ich Probleme, da mir der Sprache C# nicht so geläufig ist. Werde es aber mal genauer anschauen.
Man wächst mit seinen Aufgaben.
Außerdem sollte man als Softwareentwickler schon mehr als eine Programmiersprache zumindest lesen können.
C# ist aber einfach zu lesen und zu verstehen als bspw. reine C-Quelltexte, die hart alle Möglichkeiten der Zeigerschweinereien ausnutzen.

Eigentlich könntest du den Quelltext nehmen, stumpf die { } Klammern mit begin ersetzen, then zu den ifs hinzufügen, switch mit case of ersetzen und die inline Variablen im Delphi-Stil vor dem ersten Begin einer Methode definieren.
Dann ist schon ein Großteil des Quelltextes portiert und man kann sich um die Feinheiten kümmern, wo der Kompiler sagt: "Ne, so ist noch nicht rund!".
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: PNG komprimieren

  Alt 24. Okt 2018, 12:44
Mit der Protierung des C# Codes habe ich Probleme, da mir der Sprache C# nicht so geläufig ist. Werde es aber mal genauer anschauen.
Man wächst mit seinen Aufgaben.
Außerdem sollte man als Softwareentwickler schon mehr als eine Programmiersprache zumindest lesen können.
C# ist aber einfach zu lesen und zu verstehen als bspw. reine C-Quelltexte, die hart alle Möglichkeiten der Zeigerschweinereien ausnutzen.

Eigentlich könntest du den Quelltext nehmen, stumpf die { } Klammern mit begin ersetzen, then zu den ifs hinzufügen, switch mit case of ersetzen und die inline Variablen im Delphi-Stil vor dem ersten Begin einer Methode definieren.
Dann ist schon ein Großteil des Quelltextes portiert und man kann sich um die Feinheiten kümmern, wo der Kompiler sagt: "Ne, so ist noch nicht rund!".
Ich kann den Code schon lesen, nur gibt es halt da viele Sachen, die mir nicht geläufig sind und bei denen ich dann viel Zeit verbrate um herauszufinden, wie man das in Delphi umsetzt und wie ich das dann noch mit TPNGImage in Einklang bringe. Der Aufwand ist es mir nicht wert und dann beleibe ich lieber vorerst mal bei der externen exe.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#8

AW: PNG komprimieren

  Alt 24. Okt 2018, 12:16
pngquant.exe (https://pngquant.org/) macht ja genau das was ich will nur würde ich eben gerne dieses externe Tool eliminieren und alles in Delphi machen.
Offenbar gibt es von dem Tool auch eine embeddable library: https://github.com/ImageOptim/libimagequant

Damit kannst du das ja auch als DLL nutzen und wärst von der externen EXE weg. Eventuell lässt sich der dort verwendete C-Code ja auch leichter umsetzen - oder es findet sich jemand dafür.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: PNG komprimieren

  Alt 24. Okt 2018, 12:34
pngquant.exe (https://pngquant.org/) macht ja genau das was ich will nur würde ich eben gerne dieses externe Tool eliminieren und alles in Delphi machen.
Offenbar gibt es von dem Tool auch eine embeddable library: https://github.com/ImageOptim/libimagequant

Damit kannst du das ja auch als DLL nutzen und wärst von der externen EXE weg. Eventuell lässt sich der dort verwendete C-Code ja auch leichter umsetzen - oder es findet sich jemand dafür.
Habe da aber leider keine DLL gefunden. Habe das auch schon angeschaut aber gleich wieder aufgegeben. Der Aufwand wird mir da zu gross. Werde vorerst mal weiter mit der exe arbeiten. Schade dass es hierzu (PNG-8 Konvertierung) keinen Delphi Code zu finden gibt.
  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 23:57 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