Jak nastavit v convert nejvyšší možnou kompresi PNG

TomasTom

Zkousel jsem neco najit, a jsou tam 3 parametry, strategy, filter a level (uroven komprese).
Pak jsem nasel, ze je mozne zadat parametr -quality XY, coz je divne pojmenovane protoze png je bezstratove, to cislo jsou dva parametry, s uplne jinym vyznamem nez u JPG  (u JPG je to kvalita obrazku, cim vic, tim lip, ale vetsi soubor). Pro nejlepsi kompresi je parametr X=9, u parametru Y (podle vseho X je uroven komprese a Y je filtr) si nejsem jisty, podle toho, co jsem zkousel 0,2 a 5. Ale je to spis u kazdeho obrazku jinak.

Podle vseho lze zadat i 3 parametry -quality XYZ (X-level, Y-filter, Z-strategy), moc to ale nepomaha.

Mel by nekdo nejaky napad, jak zadat parametry co nejlepe ?

Kdyz chci snizit barevnou hloubku z 24 na 8 bitu, je lepsi jit prez GIF, nebo jen dat parametr -depth 8 . Nechci, aby byla pouzita dirhetace, jen se k urcite barve priradi jina a pouzije se paleta 256 barev (pro co nejmensi velikost). Jedna se o mapy, grafy, schemata, ne o fotky,scan nebo podobne.

Diky za napady, jestli to uz nekdo nekdy zkousel.
« Poslední změna: 06. 11. 2017, 13:59:24 od Petr Krčmář »


Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #1 kdy: 05. 11. 2017, 11:52:31 »
Pro každý obrázek se hodí jiné nastavení, takže než v convertu je dobré na výsledné png pustit něco jako pngcrush (apod. programy, je jich víc). Ty vyzkouší více metod komprese a uloží nejmenší výsledek.

Pavel Tišnovský

Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #2 kdy: 05. 11. 2017, 12:06:18 »
Zkus výsledek ještě prohnat přes pngcrush (volitelně s parametrem -brute, když budeš mít dost CPU času).

Jinak u malých obrázků, například spritů, se konverze z true color do obrázku s osmibitovou paletou nemusí vyplatit, protože jen na uložení palety si to vezme zhruba 256*3+12 bajtů. Můžeš ale mít speciální případy s menší paletou, řekněme ikony, které někdo ručně nakreslil v 16/32/64 barvách. Potom je v pngcrush volba na zmenšení palety (kupodivu totiž hodně programů uloží všech 256 barev, i když se některé nepoužívají).

Dithering zhoršuje kompresi, takže to chce zase odzkoušet.

Pavel Tišnovský

Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #3 kdy: 05. 11. 2017, 12:09:50 »
jo ještě maličkost - u malých obrázků (zase ikony) může vyjít GIF menší, ale je to většinou v jednotkách %. GIF má totiž úspornější uložení hlaviček jednotlivých chunků (například neřeší CRC), což se ale u větších obrázků vyrovná lepším kompresním algoritmem PNG a možností předfiltrace řádků.

Pokud jsou fakt ty zdrojové obrázky s pár barvama  - tedy neprošlo to například přes JPEG :-) - tak zkus uložení do PNG + pngcrush (nebo jiný podobný tool).

trubicoid2

Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #4 kdy: 05. 11. 2017, 15:27:44 »
na hodně různých souborech mi nejlíp fungovalo -quality 95, víc se tím convert zabývat nemá cenu, protože existuje více speciálních nástrojů

pngcrush - nebrat, pomalý a starý a existuje od něj odvozený novější optipng, který dělá transformace jen v paměti, takže rychleji http://optipng.sourceforge.net/

maximální redukce (trvá dost dlouho, normálně stačí asi rychlejší -o5)
Kód: [Vybrat]
optipng -fix -silent -preserve -strip all -o7 -zm1-9 in.png out.png
no a pak je tu ještě zopfli, ten to často zkompresuje ještě víc, ale trvá dlouho https://github.com/google/zopfli
maximální redukce (jestli nechceš čekat dlouho tak vynech -m)
Kód: [Vybrat]
zopflipng -m --lossy_8bit --lossy_transparent -y out.png
jestli budeš dělat zopflipng, tak se krok s optipng asi může vypustit


trubicoid2

Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #5 kdy: 05. 11. 2017, 15:32:12 »
zopfli ještě uměl advpng http://www.advancemame.it/doc-advpng.html

ten ale neuměl paletované obrázky, tedy asi takové, co budeš mít

atarist

Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #6 kdy: 05. 11. 2017, 16:34:40 »
pngcrush - nebrat, pomalý a starý a existuje od něj odvozený novější optipng, který dělá transformace jen v paměti, takže rychleji http://optipng.sourceforge.net/

záleží na nastaveních. PNGcrush je pomalejší (při -brute), protože prostě projde všech 140 (+-) možností, kdežto OptiPNG má nějakou heuristiku, co použít. Mě dával PNGcrush menší výsledné soubory právě u generovaných map s relativně velkými jednobarevnými plochami (poměrně malé "dlaždičky"). Taky jde laborovat s window size při komprimaci. Ještě víc pomohlo snížení počtu barev + redukce palety, ale to už záleží na vstupních datech.

Co tedy PNGcrush (OptiPNG netuším) neumí, je využití více jader, ale stejně jsem ho používal v dávkách pro stovky souborů, takže find+xargs to vlastně vyřešil :)

atarist

Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #7 kdy: 05. 11. 2017, 16:39:07 »
ale jinak souhlas s tím convertem - prostě je nejlepší si obrázky připravit do přesně takové podoby, jakou potřebuješ (ořez, paleta, textové chunky, !!!dobře nastavená gamma!!!) třeba i tím convertem, uložit do PNG a potom přechroustat toolem, který dělá jen a jen lossless optimalizace (pokud máš hodně CPU timu, tak použij všechny tři tooly a vyber si nejmenší soubory).

trubicoid2

Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #8 kdy: 05. 11. 2017, 18:37:40 »
záleží asi na nastavení a na souboru, teď jsem zkusil pngcrush, optipng a zopflipng na https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/NewTux.svg/625px-NewTux.svg.png

Kód: [Vybrat]
original: 95825
pngcrush -brute: 77912
optipng -fix -silent -preserve -strip all -o7 -zm1-9: 76954
zopflipng -m --lossy_8bit --lossy_transparent -y: 73303

trubicoid2

Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #9 kdy: 05. 11. 2017, 18:44:35 »
a jsou teda všechny jednovláknové, takže ten xargs nebo parallel

TomasTom

Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #10 kdy: 05. 11. 2017, 20:02:57 »
Diky, to jsem ani nevedel, ze jsou na to tak specializovane nastroje. Je teda pravda, ze to pak trva mnohem dele, to i na rychlym CPU. Pouzivam vetsinou davkovou konverzi s 1k-1M souboru.

convert -qualiy 95 pouzivam, vetsinou to byl dobry vysledek, co je nejlepsi - zaviselo to na kazdem suboru, vetsinou byl convert o par bajtu horsi, nez xnwiev png komprese 9. Casto nehralo roli nastaveni 95, 92 nebo 90, ale 95 je vetsinou nejlepsi.

optipng -fix -silent -preserve -strip all -o7 -zm1-9
Hazi chybu:
** Error: Lossy operations are not currently supported
Funguje to bez vynechani parametru -strip. Chvilku si clovek pocka, da to lepsi vysledek, nez convert -quality 95

Dirhetace podstatne zvysi clenitost barev u jinak jednobarevnych ploch, coz muze byt i vetsi velikost nez u barevne hloubky 24 bit. A taky to uz vypada hur casto.

Jedna mapa 8 bit hloubky:
convert -quality 95 or 92 or 90  --- 251 235 B cca 4 s cas
optipng -fix -silent -preserve all -o7 -zm1-9 --- 251 151 B cca 7 minut cas
pngcrush -brute --- 251 151 B cas 66.4 s
zopflipng: command not found (zopfli je nainstalovany, mozna stara verze)

Jeden z typu obrazku, na ktere to pouzivam
http://meteotommy.twilightsparkle.cz/OBR/tutiempo_gsod/Czech_Slovakia/LIBUS-PRAHA_115200/GRAPH_TEMP_Lines/

Vetsi mapy (lepsi zachovat 24 bit barvy)
http://meteotommy.twilightsparkle.cz/OBR/Venus_Topography/

Nebo mapy
http://meteotommy.twilightsparkle.cz/OBR/TEST/OneTimeWeather0050122000_MAP_Classic_MOLA_TEMP.png

Dost napadu jsem nasel i tady:
https://stackoverflow.com/questions/27267073/imagemagick-lossless-max-compression-for-png

P_V

  • ***
  • 227
    • Zobrazit profil
    • E-mail
Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #11 kdy: 05. 11. 2017, 20:42:33 »
TomasTom: K optimalizaci těch grafů by mj. pomohlo, nedělat u popisků antialiasing.

TomasTom

Re:Jak nastavit v convert nejvyssi moznou kompresi PNG
« Odpověď #12 kdy: 06. 11. 2017, 00:00:21 »
TomasTom: K optimalizaci těch grafů by mj. pomohlo, nedělat u popisků antialiasing.

Kde presne a co mas namysli ? Jen u jednoduhych grafu, nebo u map ?
Zmenit pismo u os ? Grafy delam v Gnuplotu, nastavil jsem jen font a typ cisla datum na vodorovne ose.