Verkleinern Sie ein PNG, indem Sie es in JPEG konvertieren
PNG ist verlustfrei, sodass ein so gespeichertes Foto jedes Sensordetail behält, das niemand sehen kann, und dafür den vollen Preis zahlt. JPEG verwirft die hochfrequenten Details, die das Auge am schlechtesten wahrnimmt, was auf einem Foto normalerweise zu einer fünf- bis zwanzigmal kleineren Datei bei Qualität 60 ohne offensichtliche Veränderung führt. Bei flachen Grafiken, Screenshots und Strichzeichnungen ist die Einsparung viel geringer und kann negativ sein.
Jedes PNG, einschließlich 16-Bit-, Paletten- und Interlaced-Dateien. Es wird in dieser Registerkarte gelesen und niemals irgendwohin gesendet.
Qualität 60 mit 4:2:0-Unterabtastung ist der übliche Sweet Spot für einen Anhang: deutlich kleiner, und der Verlust zeigt sich nur, wenn man hineinzoomt.
Screenshots von Texten lassen sich im JPEG-Format schlecht komprimieren und es treten sichtbare Ränder um die Buchstaben herum auf. Behalten Sie diese daher im PNG-Format und beschneiden Sie sie stattdessen.
Beim Konvertieren eines JPEGs, das von einem JPEG stammt, geht jedes Mal etwas mehr verloren. Beginnen Sie also immer mit dem ursprünglichen PNG und nicht mit einem vorherigen Export.
So funktioniert es
So wird es gemacht
- Lesen Sie die ausgewählte Datei auf dieser Registerkarte, überprüfen Sie die 8-Byte-PNG-Signatur und durchlaufen Sie dann die Chunk-Kette für IHDR, PLTE, tRNS, IDAT und pHYs.
- Dekomprimieren Sie die verketteten IDAT-Blöcke als einen Zlib-Stream, indem Sie den browsereigenen DecompressionStream anstelle eines gebündelten Inflaters verwenden.
- Machen Sie den zeilenspezifischen Filter rückgängig – „Keine“, „Unter“, „Aufwärts“, „Durchschnitt“ oder „Paeth“ – und bearbeiten Sie das Bild nach unten, da jede Zeile anhand der Zeile darüber und des Pixels links davon vorhergesagt wird.
- Erweitern Sie die Samples auf 8-Bit-RGBA, unabhängig vom Farbtyp und der Bittiefe der Datei, und setzen Sie die sieben Durchgänge zuerst neu zusammen, wenn das PNG interlaced ist.
- Fügen Sie jedes Pixel mithilfe seines Alphas zur ausgewählten Hintergrundfarbe zusammen, sodass ein transparentes Pixel diese Farbe annimmt und nicht die Farbe, die sich darunter befand.
- Konvertieren Sie in Y, Cb und Cr mit den vollständigen BT.601-Koeffizienten, die JFIF spezifiziert, und halbieren Sie die Auflösung der beiden Farbebenen mit einem Boxfilter, wenn 4:2:0 verwendet wird.
- Nehmen Sie die diskrete Kosinustransformation jedes 8x8-Blocks, dividieren Sie sie durch die für die gewählte Qualität skalierte Anhang-K-Quantisierungstabelle und runden Sie.
- Huffman-kodieren Sie die Koeffizienten mit den Annex-K-Tabellen, fügen Sie nach jedem Literal 0xFF ein Null-Byte ein und schreiben Sie die JFIF-Markierungssegmente um das Ergebnis.
Wovon es ausgeht
- Die Transparenz wird auf die ausgewählte Farbe reduziert, bevor etwas anderes passiert, und die Mischung erfolgt in sRGB und nicht in linearem Licht. Das ist physikalisch nicht korrekt – ein halbtransparentes Pixel erscheint ein paar Prozent dunkler als es sollte –, aber es ist das, was ein Browser-Canvas und jeder Bildeditor tun, sodass das JPEG mit dem PNG übereinstimmt, das Sie betrachtet haben.
- Qualität ist die Skala aus Anhang K der JPEG-Spezifikation, nicht die des Browsers. Die gleiche Zahl gibt hier in jedem Browser Byte für Byte dieselbe Datei an, sie stimmt jedoch nicht mit „Qualität 82“ in Photoshop oder GIMP überein, da diese jeweils von unterschiedlichen Tabellen ausgehen.
- Unterhalb von Qualität 90 werden die beiden Farbkanäle in jeder Richtung mit halber Auflösung gespeichert. Auf einem Foto ist dies unsichtbar; Bei gesättigtem Text oder dünnen farbigen Linien zeigt es sich als Rand, weshalb die Einstellung auf 4:4:4 erzwungen werden kann.
- Ein 16-Bit-PNG wird auf acht Bits reduziert, indem das High-Byte jedes Samples beibehalten wird. JPEG ist ein 8-Bit-Format, sodass das Low-Byte nirgendwo hingehen kann.
- Farbprofile werden nicht übernommen. Ein iCCP-, GAMA- oder cHRM-Block im PNG wird ignoriert und das Ergebnis wird als einfaches sRGB geschrieben, sodass ein Bild mit großem Farbraum flacher aussieht als das Original.
Fragen
Welche Größenbeschränkung legen E-Mail-Anbieter tatsächlich fest?
Gmail und Outlook begrenzen jeweils die Größe einer Nachricht auf etwa 25 MB inklusive Codierungsaufwand, was etwa 20 MB der tatsächlichen Anhänge entspricht. Unternehmens-Mailserver sind oft weitaus strenger – 10 MB sind üblich – und leiten die Nachricht normalerweise nach dem Senden zurück, anstatt sie von vornherein abzulehnen.
Ist es besser, die Größe zu ändern oder stärker zu komprimieren?
Zuerst die Größe ändern. Ein 4000-Pixel-Foto, das auf einem Telefon angezeigt wird, wird ohnehin verkleinert, sodass diese Pixel Bytes kosten und nichts zurückgeben. Eine Reduzierung auf 1600 Breite bei einer Qualität von 80 ist normalerweise besser, als die Abmessungen beizubehalten und die Qualität auf 40 zu reduzieren, was zu sichtbaren Blockierungen führt.
Quellen
- Portable Network Graphics (PNG) Specification (Third Edition)
- Recommendation T.81: Information technology – Digital compression and coding of continuous-tone still images – Requirements and guidelines
- Recommendation T.871: Information technology – Digital compression and coding of continuous-tone still images: JPEG File Interchange Format (JFIF)
- RFC 1950: ZLIB Compressed Data Format Specification version 3.3
Die vollständige Methode, das Rechenbeispiel und alle Annahmen hinter diesem Ergebnis stehen auf PNG-zu-JPEG-Konverter.