Nejlepší možná komprese PNG s 8bitovou hloubkou

Nejlepší možná komprese PNG s 8bitovou hloubkou
« kdy: 02. 03. 2020, 20:16:54 »
Zdravim

Jiz delsi dobu se snazim prijit na to, jak co nejlepe zkonvertovat na maximalni moznou kompresi velke mnozstvi PNG-GIF obrazku. Jedna se o grafy, a mapy s jasnym rozhrannim barev (ne pozvolny prechod vice barev). Pocet souboru je desetitisice az statisice.

Ta nejvetsi otazka je, jak nejlepe prevest PNG obrazky s 24 bit na 8 bit. Driv pred lety se jednoznacne osvedsila stara verze XnView, vysledne soubory meli nejmensi velikost, kvalitu prakticky stejnou. Vsechny PNG obrazky jsem zkonvertoval na GIF. U obrazku s hloubkou 24 bit se me to zeptalo, jaky typ barevne skaly chci a jestli se ma pouzit dirhetace. Pri dirhetaci se barvy ruzne misi s prechodem na mensi pocet barev, vysledny soubor je pak vetsi a navic vypada hur. Takze jsem vzdy zvolil barevnou skalu 256 barev bez dirhetace. Moznosti byly i jine (256 odstinu sedi, 64 barev ci odstinu sedi, cerna a bila).

Jenze zminenou volbu mel nekolik let stary XnView, navic pod Windows. Novejsi verze XnView jak Win tak Linux pri konverzi z PNG (ci jineho formatu) na GIF vubec moznost zvolit typ palety a dirhetace nemaji, vzdy dirhetaci pouziji. Navic se list souboru nacita jako miniatury, coz puvodni nacitani zdrzuje a nekdy i dojde pamet.

Otazkou tedy je co a jak pouzit pro davkovou konverzi obrazku na format PNG, tak aby byla velikost co nejmensi (tedy vc. snizeni barevne houbky na 8 bit) ?

Aktualni XnView - tam nejde vypnout dirhetace a navic se tam nacitaji miniatury (nenasel jsem, jak to vypnout), az to zahlti pamet a system.

Druhou moznosti je v terminale convert. Na samotne ulozeni do png se mi osvedsilo convert -quality 95 OldFile NewFile. Tady -quality neznamena kvalita (komprese bezstratova), ale uroven komprese a typ filtru. Ale zase je tu spis ta puvodni otazka, pred ulozenim do PNG jak snizit barevnou hloubku na 8 bit. Pouzivam konverzi do GIF. Vysledne soubory jsou ale stale vetsi, nez jak to delal stary XnView. Nejspis convert take pouzivat nejaky typ dirhetace, neprisel jsem na to, jak vypnout dirhetaci pri prevodu na 8 bit.

Neco jineho ? S necim jinym zkusenosti nemam, ale mozna uz nekdo neco pouzil driv.
« Poslední změna: 02. 03. 2020, 21:14:05 od Petr Krčmář »


Re:Nejlepší možná komprese PNG s 8bitovou hloubkou
« Odpověď #1 kdy: 02. 03. 2020, 21:22:57 »
ImageMagick samozřejmě umí dithering vypnout, mělo by stačit něco takového:

Kód: [Vybrat]
convert vstup.png  +dither -colors 256 vystup.png
Co se týče snížení velikosti, velmi se mi osvědčila utilita pngquant (je normálně v balíčcích). Používá vektorovou kvantizaci k úpravě palety a má vlastní adaptivní ditheringový algoritmus. Výsledky jsou opticky velmi podobné originálu, ale velikost často klesá k desetině původní. Doporučuji vyzkoušet, jestli tohle nepřinese kýžený výsledek.

luvar

  • ***
  • 225
    • Zobrazit profil
    • E-mail
Re:Nejlepší možná komprese PNG s 8bitovou hloubkou
« Odpověď #2 kdy: 03. 03. 2020, 09:40:59 »
Osobne mam skusenost s optimalizaciou web grafiky, kedy (tusim gimp, alebo dajaky photoshop 5) graficky sw optimalizoval paletu (maximalne 256 "index colors", ale zvacsa mali obrazky tak 10 az 30 farieb) a nasledne optimalizacny sw nasiel kombinaciu kompresinych parametrov, kedy to bolo najmensie (vid nizsie).

Druha skusenost bola s vyrendrovanymi "map tiles" z open street map, kde to malo tiez indexovu paletu s par farbami a opat som bezstratovo optimalizoval velkost.

Pouzival som:

Mam taky pocit, ze Vas gif medzistupen je kvoli indexovaj palete. Skuste zagooglit nieco tym smerom. Napriklad:

Re:Nejlepší možná komprese PNG s 8bitovou hloubkou
« Odpověď #3 kdy: 03. 03. 2020, 10:15:11 »
Ahoj, pokud nevadi, ze je to pomale, ma docela dobre vysledky zopfli (samozrejme zalezi na konkretnim obrazku): https://github.com/google/zopfli

Na PNG se mi osvedcil Crunch: https://github.com/chrissimpkins/Crunch/ (pousti pngquant a pak zopfli, autor Crunche ma nejaky vylepseny fork). Pripadne moje odlehcena bashova verze https://github.com/helb/crunch-lite

tecka

  • ***
  • 138
    • Zobrazit profil
    • E-mail
Re:Nejlepší možná komprese PNG s 8bitovou hloubkou
« Odpověď #4 kdy: 03. 03. 2020, 10:57:26 »
Pokyd by byla možnost odbočit jiným směrem, nestál by za zkoušku nějaký vektorový formát?


P_V

  • ***
  • 227
    • Zobrazit profil
    • E-mail
Re:Nejlepší možná komprese PNG s 8bitovou hloubkou
« Odpověď #5 kdy: 03. 03. 2020, 14:10:49 »
Pokyd by byla možnost odbočit jiným směrem, nestál by za zkoušku nějaký vektorový formát?
Nebo aspoň to generovat s vypnutým antialiasingem. Bude to trochu zubaté a možná bude nutné použít jiný/větší font, ale bude v tom už z počátku minimum barev.

Nebo se nebát jpg, s vypnutým subsamplingem. Není to zas tak špatné.

Re:Nejlepší možná komprese PNG s 8bitovou hloubkou
« Odpověď #6 kdy: 04. 03. 2020, 15:18:20 »
P_V

JPG urcite ne, to uz mam vyzkouseny. To se hodi spis na fotky a pod. Na grafy-schemata moc ne, je to pri vetsi kompresi ztratova komprese a tak tam jsou rozdily u tohoto typu obrazku pomerne videt. A kdyz dam ztraty pri kompresi minimalni, zase je to podstatne vetsi nez PNG.

tecka

Vektorovy format je vyhodny, kdyz uz se udela pri samotnem vytvareni mapy-grafu. To pak soubor byva jeste mensi. Ale prevadet PNG-GIF nebo i JPG na vektorovy format, to nevim, jestli pujde dobre.

Jiří Helebrant, Petr Krčmář
PngCunch spousti pngquant a pak zopfli ? Png crunch vypada velmi dobre , hlavne co se tyce vysledne velikosti. pngquant vypada ze velmi dobre funguje na zmenseni png obrazku. Snizeni barevne hloubky na 8 bit (256 barev) ,bez dirhetace, podle testu dava asi nejlepsi vysledek. I samotny klasicky imagemagick s vypnutim dirhetace:

convert vstup.png  +dither -colors 256 vystup.png

Dava lepsi vysledky. Puvodni 24 bit PNG melo 811 kB, klasicky prechod prez GIF a pak PNG quality 95 pak 251 kB a rovnou do PNG s vypnutim dirhetace a  quality 95 dosahlo 227 kB, bez parametru  quality 95 pak 231 kB.

pngquant a pngcrunch pak vypada s jeste lepsimi vysledky.

luvar

Ano, GIF je mezistupen kvuli indexove palete - snizeni na 8 bit. Ale podle vseho mezistupen GIF ani nebude nutny. Photoshop-Gimp jsou spis klikaci programy, ty na davkovou knoverzi nepujdo, tam jde spis o kresleni. Velmi dobre vypada ten pngcrunch, ktery tu byl nekolikrat zminen (s pouzitim pngquant a zopfli). Dulezite je, aby sla ta davkova konverze, i ve vnorenych slozkach, nejlepe v bashi find.

Diky moc vsem, zkusim co a jak bude vychazet.

Re:Nejlepší možná komprese PNG s 8bitovou hloubkou
« Odpověď #7 kdy: 05. 03. 2020, 16:29:14 »
Jak už tu někteří psali:

IrfanView [1] umí hromadnou konverzi souborů včetně snížení počtu barev. Použít plug-in PNGOut. Nebo stand-alone verzi PNGOout. [2]

PNGCrush [3]

brotli / zopfli [4][5]

Pak mě ještě napadá: Kdo bude ty výsledné soubory konzumovat? Bude to běžný Franta uživatel? Nebo to bude software, který máš pod kontrolou ty (například web browser)? V v druhém případě bych alespoň zvážil variantu komprimovat do jiného formátu než je PNG. Například moderní bezeztrátové formáty vycházející z video komprese pro i-frame typu HEIF [6], WebP [7], BPG [8] a další.

Marek

[1] https://www.irfanview.com/
[2] http://advsys.net/ken/utils.htm
[3] https://pmt.sourceforge.io/pngcrush/
[4] https://github.com/google/brotli
[5] https://github.com/google/zopfli
[6] https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format
[7] https://en.wikipedia.org/wiki/WebP
[8] https://bellard.org/bpg/


Re:Nejlepší možná komprese PNG s 8bitovou hloubkou
« Odpověď #8 kdy: 06. 03. 2020, 13:34:26 »
Nevím jestli je to use-case tazatele, ale pro mě bylo překvapením, že PNG může fungovat i jako tabulka. Abych to osvětlil, hledal jsem na webu, kde ČHMI na webu zveřejňuje data z radarového měření. A neustále jsem narážel pouze na ten už zpracovaný PNG soubor. Viz http://portal.chmi.cz/files/portal/docs/meteo/rad/data_tr_png_1km/pacz23.z_max3d.20200304.1215.0.png

To mi bylo k ničemu, pokud jsem chtěl vědět, že mi zrovna prší nad domem. Až po chvíli mi došlo, že png JSOU ta surová data. Pixel X300Y500 a jeho hodnota udává právě zeměpisnou polohu, barva pak hodnotu srážek. Parsovat PNG je pak pomocí knihovny podobně složité jako csv.

Tak jen taková zajímavost. Možná to nějaké mapové softwary mají stejně.

Re:Nejlepší možná komprese PNG s 8bitovou hloubkou
« Odpověď #9 kdy: 06. 03. 2020, 17:54:09 »
MarekKnapek

IrfanView  a podobny XnView umi dobre davkovou konverzi obrazku, vc. podslozek. Skriptovaci sice neni (nebo jsem neobevil, jak na to v bashi). Ten byl diskutovan hned na zacatku. U XnView sla vypnout dirhetace jen u starsi verze, kterou jsem mel (a jeste mam ten program) pod Widlema, takze nic moc. Novy XnView neumi dirhetaci vypnout resp. nastavit barevny profil pri snizeni barevne hloubky, navic (a nenasel jsem jak to vypnout, stary XnView to nedelal) se nacitaji vsechny soubory ke konverzi jako miniatury, coz zere dost systemove prostredky a pri velkem poctu souboru ti dojde RAM a zamrzne system.IfravView na tom podle vseho bude podobne.

PNGCrush a brotli / zopfli vypada ze jde prez find v bashi, coz je idealni. Komprese PNG vypada jeste lepsi. Zabere to vic procesoroveho casu, to je ale vhledem k dotazu a pozadavkum samozrejmosti. I samotny convert resp. ImageMagck umi vypnout dirhetaci, jak poradil hned uzivatel Petr Krčmář.

Vysledne obrazky jsou pak pro BFU, pro me, a mohou se v budoucnu, az budu lepe umet skrptovat treba, pouzit pro program ke zpracovani. Pro web browser taky mohou byt pouzita. PNG je zatim nejlepsi format pro bezstratovou kompresi, co jsem kdy objevil. Pro fotky se moc treba nehodi, hodi se pro mapy, grafy, schemata a nebo i velmi kvalitni fotky. Dulezite jsou ostre hrany. PNG byl vyvinut jiz pred 25 lety a proto je dost dobre mozne, ze existuje lepsi bezstratova komprese, nez PNG, jen neni moc rozsirena. S mymi zacatky na kompu vladl hlavne GIF, horsi parametry i kompese nez PNG, navic nesvobodny. Ted uz je PNG dost rozsirene. Ale muze byt uz neco o dost lepsiho. Stejne tak jako se vyviji v prubehu casu komprese dat zip - rar - bz2 - 7zip - paq.

Re:Nejlepší možná komprese PNG s 8bitovou hloubkou
« Odpověď #10 kdy: 06. 03. 2020, 18:40:37 »
SpaceExit

PNG, GIF, JPG, BMP a mnoho dalsich, to jsou vsechno rastrove formaty, kde je ke kazdemu bodu prirazena barva, tedy hodnota. Barevna hloubka je rozpeti - pocet ruznych hodnot,ktere dany bod muze mit. Barevna hloubka obrazku X bitu znamena, ze kazdy bod muze nabyvat 2naX ruznych hodnot. X muze byt 1,4,8,16,24,32 i 48 ci jina hodnota.

BMP - to je surova tabulka hodnot nebo databaze, bez jake koliv komprese, neco jako textovy soubor. PNG, GIF, JPG pouzivaji ruzne kompresni algoritmy (napodobne jako zip, rar, 7z,bz2 paq pro obecnou kompresi dat). GIF, PNG, tam je komprese bezstratova, data pri kompresi nejsou nijak modifikovana. JPG se poiziva hlavne na fotky, komprese je to ztratova, dojde k modifikaci dat trochu, za co dostaneme lepsi kompresi. U fotek mirna ztrata dat nevadi narozdil od schemat. GIF a PNG umoznuji jeste pridat krome barev kanal pruhledosti, jak moc je kazdy pixel pruhledny a je videt pozadi za nim. Ted nevim, jestli si to pamatuji dobre, tak GIF ma pro kazdy pixel hodnotu pruhlednosti 0-1, tedy zcela pruhledy-nepruhledny. PNG by melo mit pro kazdy bod 8-bitovou pruhlednost, tedy neco jako 256 odstinu pruhledosti. Kazdopadne ted nevim, jestli si to pamatuji dobre. Kanal pruhlednosti (jedna se o Alfa kanal ? Ted nevim) muze-nemusi obrazek obsahovat.

Puvodni dotaz znel, jak velikost obrazku snizit na minimum, protoze budu pracovat s mnoho obrazky. Tedy kanal pruhlednoti by nemel obsahovat, barevna hloubka 8 bit (256 barev). Hlavni problem je snizovani barevne lhloubky s vyssi (16, 24 bit ci vic) na 8 bit, aby moc to nenarusilo kvalitu, ale velikost byla co nejmensi. Dirhetaceruzne barvy promicha okolo, takze neni videt snizeni barevne hloubky tolik. Zase je tam vic rozdilu mezi okolnimi pixely, soubor je pak vetsi. Proto chci dirhetaci vypnout. Pri snizeni barevne hloubky na paletu s 256 barvami bez dirhetace je velikost souboru nejmensi, kvalita u daneho typu obrazku prakticky stejna. Dalsi veci je zpusob ulozeni PNG dle parametru. Je to bezstratova komprese. PNGCrunch podle vseho zkousi ruzne typy parametru a zvoli parametry, kde je nejmensi velikost souboru. Tedy pokud se nepletu. Mozna ze proces bezi jinak.

Pouzivam prakticky stejne-podobne typy dat, jako jsi dal odkaz. Co se tyce tech radarovych snimku od CHMI, tam jsou data jen par dni dozadu, pak uz odkaz nebude fungovat. Dany obrazek ma podle vseho pruhlednost v ruznych bodech, hlavne tam, kde neprsi a radarove odrazy nejsou, je pruhlednost maximalni. Pod timto obrazkem jsou dalsi, casto nemenne PNG, mapove podkady a pod. A dalsi vrstva je pruhledny obrazek s krizem, jez zaskrtne zvolenou pozici. Jinak PNG je samozrejme komprimovany datovy soubor v tomhle pripade. Komprese je lepsi vetsinou nez CSV + 7zip.

Jeden z typu map, u kterych je ta komprese dulezita, jak vyjit s co nejlepsi variantou, je prave radar Evropy:
http://pogodynka.pl/http/assets/products/radar_europa/T_PABH21_C_EUOC_20200306170000.png

Data jsou tam par hodin dozadu jen tusim, odkaz moc dlouho fungovat nebude, pak se musi zmenit datum.

Vyhodou je v jednom PNG cela mapa a radarove odrazy.

A pokud je dat vic - komprese je problem. Puvodni obrazek s hloubkou 24 bit PNG ma v prumeru cca 630 kB. Klasika prez covert (tedy imagemagick), nejdriv convert na GIF, pak na PNG quality 95, hodi mi to v prumeru . Kdyz dam, tak jak navrhoval Petr bez mezistupne GIF a s vypnutim dirhetace, stale -quality 95, tak dostanu prumerne 770 kB, nechapu. Kdyz dam nejdriv na GIF s vypnutim dirhetace  +dither -colors 256 a pak na PNG quality 95, tak dostanu velikost v prumeru 280 kB. S Xnview starym, ktery umel vypnout dirhetaci pri prevodu na GIF a pak na PNG s kompresi 9 jsem dostal v prumeru 180-190 kB a s novym XnView s konverzi na GIF, pak na PNG komprese 9 jsem dostal v prumeru 330 kB, nenasel jsem, jak vypnout dirhetaci.

U convert-image magick -quality u PNG neznamena kvalita, ale parametry ulozeni. Kvalitu to znamena u JPG.

Dalsi typ obrazku, u ktereho jsem to ladil, je tady:
https://meteomodel.pl/AKT/IMG/temp99.png

Puvodni velikost prez 800 kB (muj vzor 811 kB). Prevod na GIF a pak na PNG (pri prevodu na PNG vzdy parametr -quality 95) 251 kB a pak jak mi poradil Petr s vypnutim dirhetace  +dither -colors 256 vyjde vysledne PNG 227 kB. Kdyz nedam parametr -quality 95, je vysledny soubor 231 kB.

P_V

  • ***
  • 227
    • Zobrazit profil
    • E-mail
Re:Nejlepší možná komprese PNG s 8bitovou hloubkou
« Odpověď #11 kdy: 07. 03. 2020, 15:34:58 »
Mohlo by pomoci, převést obrázky do uživatelské palety, do které si dáte jen barvy použité v legendě, v ploše mapy, a případně několik málo mezistupňů, jelikož tam je antialiasing. Tedy méně než 256 barev. Tuto paletu bude nutno vyladit pro každý zdroj zvlášť. Bez ditheringu.
http://www.imagemagick.org/Usage/quantize/#remap