Hoe Image Compression Works: de basisprincipes
Om een of andere reden kun je eigenlijk 2 miljoen pixels in een afbeelding passen zonder 1, 97 MB ruimte te gebruiken. Ik vond een schattig 1080p-achtergrondplaatje (dat ongeveer 2 miljoen pixels heeft) en heb het gedownload. Bij het controleren van de eigenschappen merkte ik iets vreemds op: het nam slechts 230 KB ruimte op mijn harde schijf in beslag. Waarom is dat? Voor iemand die beeldcompressie niet helemaal begrijpt, lijkt het magie. Maar als je eenmaal het onderwerp hebt leren kennen, zul je begrijpen hoe sommige afbeeldingen groter zijn dan andere, ondanks het aantal pixels dat ze op je scherm innemen. De tijd is kort, dus laten we een korte duik nemen in de basisprincipes achter beeldcompressie.
Methoden, benaderingen, algoritmen in het vooronder.
Het is naïef om te denken dat er maar één manier is om een afbeelding te comprimeren. Er zijn verschillende methoden, elk met een unieke benadering van een veel voorkomend probleem, en elke benadering wordt gebruikt in verschillende algoritmen om tot een vergelijkbare conclusie te komen. Elk algoritme wordt weergegeven door een bestandsindeling (PNG, JPG, GIF, enz.). Voor nu gaan we praten over de methoden die over het algemeen worden gebruikt om afbeeldingen te comprimeren, wat zal verklaren waarom sommigen van hen zoveel minder ruimte in beslag nemen.
Compressie zonder verlies
Wanneer u in de context van beeldcompressie denkt aan het woord "verliesloos", denkt u waarschijnlijk aan een methode die er alles aan doet om de kwaliteit te behouden en toch een relatief kleine afbeeldingsgrootte behoudt. Dat is heel dicht bij de waarheid. Als een methode minimaliseert verliesvrije compressie de vervorming zo veel mogelijk, waardoor de beeldhelderheid behouden blijft. Dit gebeurt door een index te maken van alle pixels en dezelfde kleuren samen te groeperen. Het lijkt een beetje op de manier waarop bestandscompressie werkt, behalve dat we te maken hebben met kleinere gegevenseenheden.
DEFLATE is een van de meest voorkomende algoritmen voor dit soort taken. Het is gebaseerd op twee andere algoritmen (Huffman en LZ77, als je een boekenwurm bent) en het heeft een zeer beproefde manier om gegevens te groeperen die in afbeeldingen worden gevonden. In plaats van alleen de lengte van de gegevens te doorlopen en meerdere exemplaren van een pixel met dezelfde kleur op te slaan in een enkele gegevenseenheid (ook wel runlengtecodering genoemd), grijpt het dubbele reeksen gevonden in de gehele code en stelt een "aanwijzer" in voor elk gevonden duplicaat. Waar een bepaalde reeks gegevens (pixels) vaak wordt gebruikt, worden al deze pixels vervangen door een gewogen symbool dat alles verder comprimeert.
Merk op dat bij run-length codering en DEFLATE geen van de pixels daadwerkelijk wordt opgegeten of gedwongen om van kleur te veranderen. Het gebruik van deze methode resulteert uitsluitend in een afbeelding die identiek is aan het onbewerkte origineel. Het enige verschil tussen de twee ligt in hoeveel ruimte daadwerkelijk wordt ingenomen op uw harde schijf!
Lossy Compression
Zoals de naam al aangeeft, zorgt lossy compression ervoor dat een afbeelding een deel van de inhoud verliest. Wanneer het te ver wordt genomen, kan het de afbeelding onherkenbaar maken. Maar verliezen betekent niet dat u pixels elimineert. Er zijn eigenlijk twee algoritmen die vaak worden gebruikt om afbeeldingen op deze manier te comprimeren: transformeren codering en chroma subsampling . De eerste komt vaker voor in afbeeldingen en de laatste in video.
Met transformatiecodering worden de kleuren van een afbeelding gemiddeld met behulp van een speciale wiskundige formule met de naam discrete cosinustransformatie. Het beeld lijdt kleurverlies en kan artefacten (rare pixellatie op willekeurige punten van de afbeelding) introduceren bij excessief gebruik. Dit specifieke algoritme compenseert zijn onhandigheid met een sterk voordeel: je kunt dicteren hoeveel kwaliteit je wilt behouden bij de afbeelding. Met compressie zonder verlies is het het dichtst bij u om de kwaliteit holistisch te manipuleren door het aantal kleuren in te stellen dat elke afbeelding moet hebben.
Chroma subsampling neemt een andere benadering. In plaats van het gemiddelde te nemen van kleine kleurblokken, die ook de helderheid van een afbeelding kunnen beïnvloeden, probeert deze zorgvuldig de helderheid op alle gebieden gelijk te houden. Dit zorgt ervoor dat je niet al te snel een daling in kwaliteit waarneemt. Het is eigenlijk geweldig voor het comprimeren van animaties, daarom wordt het meer gebruikt in videostreams. Dat wil niet zeggen dat afbeeldingen dit algoritme ook niet gebruiken.
Maar wacht, er is meer! Google nam ook een schot op een nieuw lossy-algoritme, bekend als WebP. In plaats van het middelen van kleurinformatie, voorspelt het de kleur van een pixel door te kijken naar de fragmenten eromheen. De gegevens die feitelijk in de resulterende gecomprimeerde afbeelding zijn geschreven, is het verschil tussen de voorspelde kleur en de werkelijke kleur. Uiteindelijk zullen veel van de voorspellingen accuraat zijn, resulterend in een nul. En in plaats van een hele reeks nullen af te drukken, comprimeert het allemaal in één symbool dat hen vertegenwoordigt. De beeldnauwkeurigheid is verbeterd en de compressie vermindert de beeldgrootte met gemiddeld 25 procent in vergelijking met andere lossy-algoritmen, aldus Google.
Het is tijd voor vragen en discussie!
Als u nieuw bent in de wereld van afbeeldingsbestanden, zult u waarschijnlijk een klein deel van deze informatie verwarrend vinden. Als u een vraag heeft, plaats deze in de opmerkingen en we zullen ons best doen om deze te beantwoorden. Anders bent u welkom om dit te bespreken!