Signatur
Beschreibung
imagepng() wandelt ein GD-Bildobjekt in das verlustfreie PNG-Format um und schreibt das Ergebnis entweder direkt in den Output-Buffer (Browser) oder in eine Datei auf dem Server. PNG unterstützt Transparenz (Alpha-Kanal) und ist daher ideal für Grafiken, Logos und alle Bilder, bei denen Bildqualität ohne Kompromisse wichtig ist.
Der Parameter quality steuert die Komprimierungsstärke auf einer Skala von 0 (keine Komprimierung, größte Datei) bis 9 (maximale Komprimierung, kleinste Datei). Der Standardwert -1 übernimmt die zlib-Standardeinstellung. Anders als bei JPEG ist PNG verlustfrei – die Qualität des Bildinhalts bleibt unabhängig vom Komprimierungsgrad erhalten.
Mit dem Parameter filters können PNG-Filteralgorithmen aktiviert werden, die die Komprimierbarkeit bestimmter Bildtypen verbessern. Die Filterkonstanten (PNG_FILTER_NONE, PNG_FILTER_SUB, PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, PNG_ALL_FILTERS) können per bitweisem ODER kombiniert werden.
Soll die PNG-Ausgabe direkt an den Browser gesendet werden, muss vorher mit header('Content-Type: image/png') der korrekte MIME-Typ gesetzt werden. Es darf kein HTML oder Whitespace vor dem header()-Aufruf ausgegeben werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $image Pflicht | GdImage | Das GD-Bildobjekt, z. B. erzeugt durch imagecreate(), imagecreatetruecolor() oder imagecreatefromjpeg(). |
|
| $file | string|null | null | Pfad zur Zieldatei auf dem Server. Wird null übergeben oder der Parameter weggelassen, wird die PNG-Ausgabe direkt in den Output-Buffer (Browser) geschrieben. |
| $quality | int | -1 | Komprimierungsgrad von 0 (keine Komprimierung) bis 9 (maximale Komprimierung). -1 verwendet den zlib-Standard. Beeinflusst nur die Dateigröße, nicht die Bildqualität. |
| $filters | int | -1 | Bitmaske der anzuwendenden PNG-Filteralgorithmen, z. B. PNG_ALL_FILTERS. -1 aktiviert keine expliziten Filter. Kann die Komprimierungseffizienz bei bestimmten Bildtypen verbessern. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. wenn die Zieldatei nicht geschrieben werden kann).Beispiele
PNG direkt an den Browser ausgeben
<?php
// Bild erzeugen
$image = imagecreatetruecolor(200, 100);
// Hintergrundfarbe setzen
$bg = imagecolorallocate($image, 30, 144, 255);
imagefill($image, 0, 0, $bg);
// Text hinzufügen
$textColor = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 5, 40, 40, 'Hallo PNG!', $textColor);
// Korrekten Content-Type senden
header('Content-Type: image/png');
// PNG an Browser ausgeben
imagepng($image);
// Speicher freigeben
imagedestroy($image);
PNG mit Transparenz in Datei speichern
<?php
// Transparentes True-Color-Bild erzeugen
$image = imagecreatetruecolor(150, 150);
// Transparenz aktivieren
imagealphablending($image, false);
imagesavealpha($image, true);
// Transparenten Hintergrund füllen
$transparent = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image, 0, 0, $transparent);
// Gefüllten Kreis zeichnen
$red = imagecolorallocate($image, 220, 50, 50);
imagefilledellipse($image, 75, 75, 120, 120, $red);
// Als PNG-Datei speichern (Qualität 6, keine Sonderfilter)
$result = imagepng($image, '/var/www/html/kreis.png', 6);
if ($result) {
echo 'Bild erfolgreich gespeichert.';
} else {
echo 'Fehler beim Speichern.';
}
imagedestroy($image);
// Wichtig · Fallstricke
Header-Reihenfolge: Bei der Browser-Ausgabe muss header('Content-Type: image/png') aufgerufen werden, bevor irgendeine Ausgabe (auch Leerzeichen oder BOM) erfolgt, sonst schlägt der Header fehl.
Transparenz: Damit der Alpha-Kanal korrekt gespeichert wird, müssen vor imagepng() unbedingt imagealphablending($image, false) und imagesavealpha($image, true) aufgerufen werden. Andernfalls geht die Transparenzinformation verloren.
Output-Buffering: Um die PNG-Ausgabe in eine Variable statt in eine Datei zu schreiben, kann ob_start() / ob_get_clean() verwendet werden oder alternativ ein beschreibbarer Stream-Wrapper wie php://temp.
GD-Erweiterung: imagepng() setzt die GD-Erweiterung mit PNG-Unterstützung voraus. Ob PNG unterstützt wird, lässt sich mit gd_info() prüfen.