PNG in JPEG ohne schwarzen Hintergrund
JPEG speichert drei Farbkanäle und keinen Alphakanal, daher muss die Transparenz während der Konvertierung in eine tatsächliche Farbe umgewandelt werden. Konverter, die nie nachfragen, belassen die transparenten Pixel auf dem Wert, der sich darunter im Speicher befand, nämlich Null – Schwarz. Wenn Sie den Hintergrund auf #ffffff setzen, werden die durchsichtigen Teile weiß dargestellt, bevor etwas codiert wird, was für ein auf einer weißen Seite abgelegtes Logo erforderlich ist.
Jedes PNG, einschließlich 16-Bit-, Paletten- und Interlaced-Dateien. Es wird in dieser Registerkarte gelesen und niemals irgendwohin gesendet.
Ein transparentes PNG hat Farbwerte unter den transparenten Pixeln und diese sind oft schwarz; Der Alphakanal war das Einzige, was sie verbarg.
Passen Sie den Hintergrund an den Hintergrund an, auf dem sich das JPEG befindet. Weiß für ein Dokument und die Seitenfarbe für ein Webbanner, andernfalls wird der Rand sichtbar.
Weiche Kanten werden mit der von Ihnen gewählten Farbe überblendet. Wenn Sie also später Ihre Meinung ändern, müssen Sie das ursprüngliche PNG erneut konvertieren, anstatt das JPEG zu bearbeiten.
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
Kann ich wählen, welche Farbe die Transparenz ersetzt?
Weiß wird verwendet, weil es die Farbe ist, auf der sich ein Dokument, eine E-Mail und die meisten Webseiten befinden. Wenn das Bild auf einem dunklen Hintergrund steht, reduzieren Sie es zuerst in einem Editor auf diese Farbe – ein JPEG hat überhaupt keinen Alphakanal, daher muss die Auswahl getroffen werden, bevor das Format geändert wird.
Soll ich das PNG auch behalten?
Ja, wenn die Transparenz noch einmal benötigt werden sollte. Die Abflachung ist irreversibel: Sobald der Hintergrund weiß ist, kann er nicht wieder transparent gemacht werden, ohne das Motiv von Hand auszuschneiden. Konvertieren Sie eine Kopie und behalten Sie das Original als Master.
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.