GIFs und PNGs mit Transparenz in PHP

Dieser Artikel beschreibt sehr anschaulich wie man mit PHP und der GD-Library GIFs und PNGs, welche transparente Elemente enthalten, in PHP lädt, sie modifiziert und wieder mit Transparenz speichern kann.

Anbei möchte ich zeigen wie man mit PHP und der GD-Library GIFs und PNGs, welche transparente Elemente enthalten, in PHP lädt, sie modifiziert und wieder mit Transparenz speichern kann.

GIF-Bilder

GIF-Dateien enthalten eine Speicherzelle in der festgelegt wird welcher Farbwert später transparent dargestellt werden soll. Dieser muss also beim Laden der Datei gelesen und in der neuen Datei wieder geschrieben werden.

Das Auslesen der Farbwerte erfolgt über die Funktion ImageColorTransparent(). Das Zerlegen in die entsprechenden RGB-Werte erfolgt über ImageColorsForIndex().

Dann muss die Farbe in das neue Bild übertragen werden. Der Farbindex wird per ImageColorAllocate() ermittelt und mit Imagefill() in das neue Bild „gemalt“. Anschließend muss dieser durch ImageColorTransparent() als transparent markiert werden.

Fertig ist eine neue GIF-Abbildung mit den gleichen Transparenzeigenschaften wie das Original.

Anbei ein Beispielcode um die Größe eines transparenten GIF-Bildes zu ändern und zu speichern:

# Settings
$src = 'image2.gif';
$width = 200;
$height = 200;
$dst = 'resized-'.$src;

# Load Image
$image = imagecreatefromgif($src);
List ($width_old, $height_old, $image_type) = GetImageSize($src);

# Calculating proportionality
If     ($width  == 0) $factor = $height / $height_old;
ElseIf ($height == 0) $factor = $width / $width_old;
Else                  $factor = Min( $width / $width_old, $height / $height_old );
$final_width  = Round( $width_old * $factor );
$final_height = Round( $height_old * $factor );

# This is the resizing/resampling/transparency-preserving magic

# Create new image
$image_resized = ImageCreateTrueColor( $final_width, $final_height );

# read the transparency
$transparency = ImageColorTransparent($image);
List($r, $g, $b) = Array_Values (ImageColorsForIndex($image, $transparency));

# set transparency for the new image
$transparency = ImageColorAllocate($image_resized, $r, $g, $b);
Imagefill($image_resized, 0, 0, $transparency);
ImageColorTransparent($image_resized, $transparency);

# copy the original image in the new one (resized)
ImageCopyResampled($image_resized, $image, 0, 0, 0, 0, $final_width, $final_height, $width_old, $height_old);

# save the image
imagegif($image_resized, $dst);

PNG-Bilder

Bei PNG-Dateien funktioniert das Ganze durch Alpha-Farbmischung. Das Bedeutet man kann beim Erstellen eines Bildes festlegen ob der Hintergrund eine Farbe haben soll oder eben transparent bleibt.

Nach dem Erstellen des Bildes im Speicher kann man durch die Funktionen ImageAlphaBlending() und ImageSaveAlpha() ein leeres transparentes Bild erzeugen auf das man seine Objekte packen kann.

Anbei ein Beispielcode um die Größe eines transparenten PNG-Bildes zu ändern und zu speichern:

// Settings
$src = 'image3.png';
$width = 200;
$height = 200;
$dst = 'resized-'.$src;

# Load image
List ($width_old, $height_old, $image_type) = GetImageSize($src);
$image = imagecreatefrompng($src);

# Calculating proportionality
If     ($width  == 0) $factor = $height / $height_old;
ElseIf ($height == 0) $factor = $width / $width_old;
Else                  $factor = Min( $width / $width_old, $height / $height_old );

$final_width  = Round( $width_old * $factor );
$final_height = Round( $height_old * $factor );

# This is the resizing/resampling/transparency-preserving magic

# Create new image
$image_resized = ImageCreateTrueColor( $final_width, $final_height );

# Turn off alpha blending and set alpha flag
ImageAlphaBlending($image_resized, false);
ImageSaveAlpha($image_resized, true);

# copy image resized in the new one
ImageCopyResampled($image_resized, $image, 0, 0, 0, 0, $final_width, $final_height, $width_old, $height_old);

# Save image
imagepng($image_resized, $dst);