het verkleinen van PNG-Bestandsgrootte
een van de voordelen van mijn rol hier bij Google is dat Iget door veel Android-applicaties trolleert en op zoek gaat naar gemeenschappelijke plaatsen waar mensen hun prestaties kunnen verbeteren.
De laatste tijd merk ik de groei op van een angstaanjagende trend : opgeblazen PNG-bestanden.
zoals ik de vorige keer al zei, is PNG een geweldig, flexibel afbeeldingsbestandformaat. Het heeft een geweldige kwaliteitscontrole en ondersteunt transparantie. Als zodanig, het is uitgegroeid tot de go-to voor transparantie-zoekende ontwikkelaars voor een paar decennia nu.,
het probleem is dat het vrij eenvoudig is om opgeblazen PNG-bestanden te maken; ach, alleen al het toevoegen van twee pixels aan de breedte van uw afbeelding kan zijn grootte verdubbelen. Het is dus gemakkelijk om aan te nemen dat de meeste PNG ‘ s die er zijn gewoon niet de liefde & zorg hebben gekregen die ze verdienen.
dus, nu Ik heb trolled door ongeveer 100 APK’ s, heb ik besloten om langs mijn top suggesties over het verminderen van PNG-Bestandsgrootte. Deze suggesties zijn gebaseerd op dingen die ik heb gezien in echte apps die echte mensen gebruiken. YMMV als uw app wordt alleen gebruikt door robots, of kleine eekhoorns.,
zodra u het PNG-bestandsformaat begrijpt, wordt het duidelijk dat er een aantal duidelijke verbeterpunten zijn die kunnen resulteren in kleinere bestandsgroottes:
- onnodige brokken verwijderen
- unieke kleuren verminderen
- optimaliseer regel-voor-regel filterkeuze
- optimaliseer DEFLATE compressie
en dit is geen nieuwe informatie. PNG-optimalisatie is al lange tijd een veel voorkomend probleem; 20 jaar geleden schreef Ken Silverman een van de eerste populaire PNG-optimizers, PNGOUT. (Die werd de ruggengraat van de beroemde Duke Nukem 3D-engine.,) Sindsdien zijn er veel nieuwe PNG-optimizers op de scène gekomen; een snelle google-zoekopdracht zal een overvloed aan opties voor u opleveren om uit te kiezen:
De truc hier is dat in het volledige spectrum van dingen die een tool zou kunnen doen, elk van deze tools doet een subset ervan; dus er is geen “beste tool” voor de taak, dus zorg ervoor dat u de tijd spendeert om te evalueren welke het beste voor u werkt, en dan de hel van het.
FWIW, een persoonlijke favoriet van mij op die lijst moet zopfliPNG zijn., Het vermindert de PNG-Bestandsgrootte door een efficiëntere en krachtige deflate-fase in de compressor te bieden, waardoor het betere overeenkomsten in uw gegevens kan vinden. Het kan de PNG-Bestandsgrootte met 5% verlagen, zonder de beeldkwaliteit in welke vorm dan ook te beïnvloeden… zeker is het aanzienlijk langzamer, maar het is indrukwekkend dat er nog steeds verbeteringen kunnen worden aangebracht aan de old-school DEFLATE codec.
De essentie hier is dat als je veel data hebt die door je applicatie komen, je een PNG optimalisatie tool in je Upload / distribueren pijplijn zou moeten hebben, al was het maar om de gek op afstand te houden.,
Kleuren verminderen
nu, als de bovenstaande tools gewoon niet werken voor u, of u wilt een meer handmatige aanpak om een aantal van uw activa te verbeteren _voor_ het wordt gegooid naar een van de bovenstaande tools, dan is het de moeite waard om het heft in eigen handen te nemen.
hoewel er veel dingen zijn die je handmatig kunt doen, stel ik voor dat je je alleen concentreert op het verminderen van het aantal unieke kleuren in je afbeelding en dat je het dan de rest van de weg door een gereedschap laat nemen.,
de reden voor uw focus hier, is dat het verminderen van unieke kleuren direct invloed op de compressie potentieel in elke andere fase van de pijplijn; en gereedschappen kunnen de rest doen.
zie, de filtering fase van de PNG compressie stap wordt aangedreven door hoe variant aangrenzende pixel kleuren zijn aan elkaar. Als zodanig het verminderen van het aantal unieke kleuren in de zal de variatie in aangrenzende pixels te verminderen, het verminderen van het dynamische bereik van waarden die worden uitgespuugd uit het filteren.
als gevolg hiervan zal de DEFLATE-fase meer dubbele waarden vinden en beter kunnen comprimeren.,
Het is echter vermeldenswaard dat het verminderen van het aantal unieke kleuren, we effectief een lossy codering fase toe te passen op onze afbeelding. Dit is de reden waarom u dit proces handmatig moet behandelen. Tools hebben een moeilijke tijd het begrijpen van de menselijke perceptuele kwaliteit, en in sommige gevallen, kleine fouten aan een instrument kan eruit zien als enorme fouten voor een menselijk oog. Maar, als gedaan op de juiste manier, het moet niet merkbaar zijn voor de gebruiker, en kan een enorme hoeveelheid ruimte te besparen.
PSA: kies de juiste pixelformaat
Dit zou vanzelfsprekend moeten zijn.., Maar ik heb voorbeelden gezien in een paar APK ‘ s die het tegendeel bewijzen:
zorg ervoor dat je het juiste pixelformaat gebruikt voor je PNG-bestand.
bijvoorbeeld, als je geen alpha in de afbeelding hebt, dan is het gebruik van de RGBA 32bpp optie een verspilling van een hele ¼ van je afbeelding; gebruik in plaats daarvan het 24bpp truecolor formaat (of gebruik gewoon JPG).Evenzo, als je afbeelding alleen grijswaarden bevat, moet je het alleen opslaan als 8bpp.
zorg er in principe voor dat u uw PNG-bestand niet onbedoeld opzwelt door het verkeerde type pixelformaat te gebruiken.
geïndexeerde afbeeldingen, FTW!,
verder gaan, kleurreductie moet altijd beginnen met het proberen om uw kleuren te optimaliseren, zodat het kan worden gedefinieerd met behulp van het geïndexeerde formaat. Geïndexeerde kleurmodus, kiest in principe de beste 256 kleuren om te gebruiken, en vervangt al uw pixels met een index in dat kleurenpalet. Het resultaat is een reductie van 16 miljoen kleuren (24bpp) tot 256, wat een aanzienlijke besparing is., bestand, en een Geïndexeerde PNG-bestand
Het voorbeeld van Google Doodle hierboven werd uitgevoerd in Photoshop de “opslaan voor web” – functie, en het beeldformaat is ingesteld op PNG8, die dit kleurenpalet voor de afbeelding:
in feite, door het verplaatsen van geïndexeerde afbeeldingen, u hebt vervangen van de unieke kleuren op elke pixel, met een verwijzing naar het palet in de plaats., Het resultaat is het verplaatsen van een 32bit per pixel naar 8 bits per pixel, wat een mooie eerste stap Bestandsgrootte reductie.
Deze modus zorgt voor verdere besparingen als u bedenkt hoe de filtering en deflate stadia worden toegepast:
- het aantal unieke pixels is verminderd, wat betekent dat er een grotere kans is dat aangrenzende kleuren naar dezelfde kleur zullen wijzen
- aangezien het aantal vergelijkbare aangrenzende kleuren toeneemt, zal de filtering fase meer dubbele waarden produceren, zodat de LZ77 fase van DEFLATE deze beter kan comprimeren.,
Als u uw afbeelding kunt weergeven als een gepaletteerde afbeelding, dan hebt u een geweldige manier gedaan om de bestandsgrootte aanzienlijk te verbeteren, dus het is de moeite waard om te onderzoeken of het merendeel van uw afbeeldingen kan worden geconverteerd.
volledig transparante pixels optimaliseren
een van de mooie eigenschappen van de geïndexeerde modus is dat u specifieke kleuren in uw palet kunt aangeven om te fungeren als “transparant”. Wanneer het PNG-bestand wordt gedecodeerd naar RGBA in het hoofdgeheugen, zullen transparante pixels dienovereenkomstig worden ingesteld., Wat hier interessant is, is dat deze transparantiemodus volledig binair is; een gegeven pixel is ofwel zichtbaar, of niet.,
Dit soort van “punch-through” transparantie is vrij efficiënt in termen van compressie; Normaal gesproken gebruikt wordt voor grote delen van de achtergrond die transparant zijn, en als zodanig, is er veel van self-vergelijkbare pixels dat de PNG-Compressor kan profiteren.
maar het is alleen beschikbaar in geïndexeerde modus., Er zijn situaties waarin je dezelfde” punch through ” transparantie wilt gebruiken, maar je moet ook de volledige RGB-modus gebruiken.
in deze gevallen is het gemakkelijk om de fout te maken dat je onzichtbare pixels niet goed worden gemaskeerd. Neem het voorbeeld hieronder; beide afbeeldingen ondersteunen transparantie & Truecolor, maar één ervan is aanzienlijk kleiner.