När du söker efter "PNG komprimering" hävdar de toppplacerade verktygen båda att de är "lossa" och att "bildkvaliteten inte ändras", men komprimeringsgraden kan variera med flera gånger. Skillnaden ligger inte i vilken algoritm som är magisk, utan i att de säger "lossa" men menar olika saker. Den här artikeln förklarar skillnaden först och rekommenderar sedan verktyg efter användningsområde.
Först och främst: Två typer av "lossa"
Riktig lossa: Ingen pixel ändras
PNG är i sig ett lossa-format. Dets storlek bestäms av två delar: hur pixlarna ordnas och hur de komprimeras med Deflate, samt hur mycket metadata som finns med i filen.
Riktig lossa komprimering sysslar bara med dessa två områden:
- Byt ut ett mer utrymmesbesparande sätt att spara. Om bilden bara använder 200 färger i verkligheten, byt till palettläge; finns ingen genomskinlighet, ta bort Alpha-kanalen; spara gråskalebilder som gråskala.
- Försök med bättre filter och Deflate-parametrar. Samma pixlar kan ge väldigt olika storlekar beroende på hur de kodas. Designverktyg som exporterar PNG fokuserar ofta på hastighet och gör inte ett seriöst försök.
- Ta bort metadata. Exporteringsprograminfo, tidsstämplar, textkommentarer, miniatyrbilder, osv.
När den komprimerade bilden avkodas är den exakt densamma som originalet pixel för pixel. Priset är att man inte sparar så mycket – den kan bara pressa ut den vatten som "inte kodades alls".
"Ser ut som lossa": Egentligen är det kvantisering med förlust
Verktyg som TinyPNG och pngquant sparar mycket mer eftersom de gör något annat: minska antalet färger i PNG till under 256 (kvantisering) och använd sedan dithering så att det ser ut som om det inte har förändrats för det mänskliga ögat.
Detta är med förlust, pixlarna har ändrats. Det fungerar bra för de flesta webbikoner och illustrationer och är värt att använda; men om du behöver "absolut inga ändrade pixlar" – till exempel UI-klipp som måste vara strikt lika med designskissen, skärmbilder som ska jämföras pixel för pixel, eller material som ska redigeras senare – bör du inte använda dem.
Det enklaste sättet att avgöra om ett verktyg är riktigt lossa är att jämföra bilderna med ImageMagick
compare -metric AE original.png komprimerad.png null:
Om resultatet är0har ingen pixel ändrats.
Rekommendationer för verktyg för riktig lossa PNG
Kommandorad: oxipng (förstahandsval)
oxipng är en PNG-lossa-optimerare skriven i Rust och kan ses som den moderna efterträdaren till det klassiska verktyget OptiPNG:
- Flertrådad, snabbt, lämplig för batchbehandling.
-o 0till-o 6(samt-o max) för att reglera kompressionsstyrka; högre nivåer är långsammare men sparar mer.- Alternativt
--zopfliför ytterligare komprimering, men det är mycket långsammare. - Squoosh använder oxipng för sin PNG-lossa-komprimering.
bash
brew install oxipng
oxipng -o 2 --strip safe -r ./images # Rekursiv behandling av katalog, tar bort endast metadata som inte påverkar visningen
Kommandorad: zopflipng (för extremt liten filstorlek)
Utvecklat av Google med Zopfli-algoritmen för omarbetad Deflate-komprimering. Ofta kan den pressa ut ytterligare en smula jämfört med oxipngs standardinställningar, men den är betydligt långsammare och kan ta evigheter på stora bilder. Lämplig för "kompromisslösa" statiska resurser som logotypar och inbyggda ikoner som "komprimeras en gång och används länge".
Kommandorad: OptiPNG, pngcrush (klassiker)
Båda är klassiska verktyg för lossa PNG-optimering och finns fortfarande i många verktygskedjor. De är helt täckta av oxipngs funktioner, så det är onödigt att välja dem för nya projekt.
Webb: Squoosh
Googles onlineverktyg. För PNG välj oxipng-kodaren för att få lossa-komprimering (se till att inte kryssa i "Reduce palette", då det är en förlust-komprimering).
Fördelen är att det är installationsfritt och man kan jämföra med varandra. Nackdelen är att det bara kan hantera en bild i taget, och man måste byta namn och ersätta den själv efter nedladdning. Lämpligt för att ibland komprimera ett par bilder.
Mac med grafiskt gränssnitt: ImageOptim
Gratis och öppen källkod gammalt Mac-verktyg. Det innehåller internt flera optimerare som oxipng, Zopfli, pngcrush, osv., och provar dem alla för att hitta den minsta filen. Standardläget är lossa (förlust-läge måste aktiveras manuellt).
Det komprimerar mycket, men när alla optimerare är aktiva är det långsamt. Dessutom skriver den över filen direkt, så det är bra att säkerhetskopiera innan du börjar.
Mac med grafiskt gränssnitt: ImgZilla
ImgZilla är vårt macOS-verktyg för bildkomprimering. Det hanterar PNG på ett enkelt sätt:
- Använder oxipng för riktig lossa-komprimering med kompressionsgrad 2 (samma som Squooshs standard), balansen mellan hastighet och storlek. Ingen pixel ändras, du kan verifiera detta med kommandot
compareovan. - Gör ingen kvantisering, minskar inte färger, byter inte format, ändrar inte storlek. PNG förblir PNG efter komprimering.
- Komprometterar inte sökvägen: Filnamnet och sökvägen är oförändrade, så referenser i kod och dokument behöver inte ändras.
- Dra hela mappen i: Skannar rekursivt undermappar, hoppar över dolda filer och
node_modules. Hanterar också JPG, GIF, WebP, HEIC, AVIF och SVG. - Originalen flyttas automatiskt till papperskorgen, så om du inte är nöjd kan du högerklicka och "återställa".
- Komprometerar inte filer som inte går att komprimera: Filer med komprimeringsgrad under 0,4 % markeras som "minst möjligt" och sparas oförändrade, utan att detta drar från det gratisutrymmet.
- Kör helt lokalt: Ingen data skickas till någon server.
Två saker som behöver tydliggöras:
- Det söker inte efter extremt liten storlek för PNG. Grad 2 är mycket snabbare än
-o maxeller Zopfli, men kan ge några procent mindre sparande. Om ditt mål är "pressa en logotyp till den sista biten", är zopflipng eller ImageOptim bättre lämpliga. - Tar bort all metadata i PNG, inklusive färgprofilen. Vanliga sRGB-bilder påverkas inte; men om bilden har inbäddad en färgprofil som t.ex. Display P3 (vanligt vid skärminspelning eller export från designprogram), kan färgerna se lite annorlunda ut i färghanteringsprogram efter att profilen tagits bort. För bilder med strikta färgkrav kan du i inställningarna aktivera "Behåll EXIF-information" så behålls metadata som den är.
Sammanfattning i en tabell
| Verktyg | Typ | Är riktig lossa? | Batch | Passar vem |
|---|---|---|---|---|
| oxipng | Kommandorad | ✅ | ✅ | Utvecklare, byggprocesser |
| zopflipng | Kommandorad | ✅ | Måste skriva script själv | Vill ha extremt liten storlek, bryr sig inte om hastighet |
| OptiPNG / pngcrush | Kommandorad | ✅ | ✅ | Gamla projekt som fortsätter att använda dem |
| Squoosh | Webb | ✅ (oxipng, inte kryssat i minskning) | ❌ Ett i taget | Ibland komprimera en bild |
| ImageOptim | Mac-app | ✅ (standard) | ✅ | Mac-användare som vill ha maximal komprimeringskraft |
| ImgZilla | Mac-app | ✅ | ✅ Dra mapp | Vill batch-komprimera, vill inte ändra sökvägar, vill kunna ångra |
| TinyPNG / pngquant | Webb / Kommandorad | ❌ Kvantisering med förlust | Beror på version | Kan acceptera färre färger, vill ha högre komprimeringsgrad |
Hur väljer man?
- Endast krav på att pixlar inte ändras, vill skriva kommandon: oxipng, lägg i byggscriptet för en gång för alla.
- Vill pressa en enskild fil till extremt liten storlek: zopflipng.
- Mac med grafiskt gränssnitt för batch: ImageOptim har mer kraft; ImgZilla är snabbare, originalen går att återställa från papperskorgen och hanterar också andra format.
- Vill acceptera liten förlust för mindre filstorlek: TinyPNG / pngquant, men var medveten om att det inte längre är lossa.
Slutligen en påminnelse: Hur mycket som sparas med lossa-komprimering beror på hur PNG ursprungligen exporterades. PNG som direkt exporterats från designverktyg och aldrig behandlats ofta innehåller mycket "vatten"; redan optimerade PNG kan inte pressas ut så mycket mer – om verktyget visar "minst möjligt" betyder det att det redan är bra, inte att verktyget är dåligt.
ImgZilla stöder för närvarande endast macOS (version 12.3 eller högre) och kan laddas ner från Mac App Store. Den gratisversionen kan komprimera 10 bilder per dag; endast lyckade kompressioner räknas. Dra en mapp full med PNG i och verifiera sedan med
compareatt pixlarna faktiskt inte ändrats.
