<?php
/* -------------------------------------------------------------------------------------
Kleine Übung um zu lernen, wie man in PHP Bilder erzeugt
------------------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------------------
Funktionen:
- Zu große Radien werden automatisch auf den maximal
möglichen Radius verkleinert.
- Die Bildgröße wird unter Erhaltung des Seitenverhältnisses skaliert.
Das Bild wird dabei zentriert und ggf. beschnitten, sodass das Zielbild komplett
ausgefüllt ist.
- Wird ein Radius <= 0 angegeben, wird kein Radius erzeugt.
- Als Quellfromate sind GIF, JPG und PNG möglich.
- Zielformat ist PNG (wegen Transparenz)
------------------------------------------------------------------------------------- */
/*
* EINSTELLUNGEN
*/
$src_image = "test_gerahmt.png";
$dst_width = 200; // 200
$dst_height = 155; // 155
// Eckenradius:
$radius = 5;
// Overlay-Text:
$box_height = 26;
$box_color = array (255, 255, 255);
$text = "Fotogalerie";
$text_size = 13;
$text_color = array (0, 0, 0);
$ttf_file = "verdanab.ttf";
/*
* BILD SKALIEREN UND ZUSCHNEIDEN
*/
// Bildinformationen auslesen:
/* array getimagesize ( string $filename [, array $imageinfo] )
array[0] = Höhe
array[1] = Breite
array[2] = Bildtyp (1 = gif, 2 = jpg, 3 = png, 4 = swf)
array[3] = HTML-Zeichenkette - "height=xx width=xx"
*/
$src_info = getImageSize ($src_image);
$src_width = $src_info[0];
$src_height = $src_info[1];
$src_type = $src_info[2];
// Tatsächliche Bildgröße ermitteln, um das Seitenverhältnis zu bewahren:
/* Dabei wird die Größe so ermittelt, dass das Bild das ganze Format ausfüllt! */
$src_aspect_ratio = $src_width / $src_height;
$dst_aspect_ratio = $dst_width / $dst_height;
if ($src_aspect_ratio < $dst_aspect_ratio) {
/* Ziel hat ein breiteres Verhältnis als Quelle --> Breite anpassen */
$res_width = $dst_width;
$zoom_ratio = $dst_width / $src_width;
$res_height = $src_height * $zoom_ratio;
} else {
/* Quelle hat ein breiteres Verhältnis als Ziel --> Höhe anpassen */
$res_height = $dst_height;
$zoom_ratio = $dst_height / $src_height;
$res_width = $src_width * $zoom_ratio;
}
// Quellbild erzeugen:
switch ($src_type) {
case 1: $src_img = imageCreateFromGIF ($src_image); break;
case 2: $src_img = imageCreateFromJPEG ($src_image); break;
case 3: $src_img = imageCreateFromPNG ($src_image); break;
default: die ("Bild-Typ wird nicht unterstützt.");
}
// Zielbild erzeugen:
$img = imageCreateTrueColor ($dst_width, $dst_height);
// Bildgröße anpassen:
$offset_x = -($res_width - $dst_width) / 2;
$offset_y = -($res_height - $dst_height) / 2;
imageCopyResampled ($img, $src_img, $offset_x, $offset_y, 0, 0, $res_width, $res_height, $src_width, $src_height);
/*
* TEXT-OVERLAY EINFÜGEN
*/
// Farben erzeugen:
$box_col = imageColorAllocate ($img, $box_color[0], $box_color[1], $box_color[2]);
$text_col = imageColorAllocate ($img, $text_color[0], $text_color[1], $text_color[2]);
// Hintergrund einfügen:
imageFilledRectangle ($img, 0, $dst_height - $box_height, $dst_width, $dst_height, $box_col);
// Größe der Text-Box berechnen:
/* array imagettfbbox ( int $size , int $angle , string $fontfile , string $text )
array[0] = untere linke Ecke, X-Position
array[1] = untere linke Ecke, Y-Position
array[2] = untere rechte Ecke, X-Position
array[3] = untere rechte Ecke, Y-Position
array[4] = obere rechte Ecke, X-Position
array[5] = obere rechte Ecke, Y-Position
array[6] = obere linke Ecke, X-Position
array[7] = obere linke Ecke, Y-Position
*/
$text_info = imageTTFBBox ($text_size, 0, $ttf_file, $text);
$text_width = $text_info[4] - $text_info[6];
$text_height = $text_info[1] - $text_info[7];
// DEBUG:
// echo "height: ".$text_height."<br>";
// echo "width : ".$text_width;
// Text erzeugen:
imageTTFText ($img, $text_size, 0, ($dst_width / 2) - ($text_width / 2), ($dst_height - $box_height / 2) + ($text_height / 3), $text_col, $ttf_file, $text);
/*
* KANTEN ABRUNDEN
*/
if ($radius > 0) {
// Farbwert für die Ecken festlegen:
/* Diese Farbe wird am Ende als transparent definiert, es muss sich also
um eine Farbe handeln, die im Bild nicht vorkommt! --> An dieser Stelle dynamisch ermitteln****** */
$corner_color = array (0, 255, 0);
// maximalen Radius festlegen:
if ($dst_width > $dst_height) {
$max_radius = $dst_height/2;
} else {
$max_radius = $dst_width/2;
}
if ($radius > $max_radius) {
$radius = $max_radius;
}
// Farben erzeugen:
$corner_col = imageColorAllocate ($img, $corner_color[0], $corner_color[1], $corner_color[2]);
// Bögen erzeugen:
/* int imageArc ( resource $image, int $startpossition_x, int $startpossition_y, int $width, int $height, int $startangle, int $endangle, int $color ) */
imageArc ($img, $radius-1, $radius-1, 2*$radius-1, 2*$radius, 180, 270, $corner_col); // links oben
imageArc ($img, $dst_width-$radius, $radius-1, 2*$radius, 2*$radius, 270, 360, $corner_col); // rechts oben
imageArc ($img, $dst_width-$radius, $dst_height-$radius, 2*$radius, 2*$radius, 360, 90, $corner_col); // rechts unten
imageArc ($img, $radius-1, $dst_height-$radius, 2*$radius-1, 2*$radius, 90, 180, $corner_col); // links unten
// Ecken füllen:
imageFillToBorder ($img, 0, 0, $corner_col, $corner_col); // links oben
imageFillToBorder ($img, $dst_width, 0, $corner_col, $corner_col); // rechts oben
imageFillToBorder ($img, $dst_width, $dst_height, $corner_col, $corner_col); // rechts unten
imageFillToBorder ($img, 0, $dst_height, $corner_col, $corner_col); // links unten
// Eckenfarbe als transparent definieren:
imageColorTransparent ($img, $corner_col);
}
/*
* BILD AUSGEBEN
*/
// Header setzen:
/* Wenn der Header erst hier gesetzt wird, werden evtl. Fehlermeldungen vorher noch ausgegeben */
header ("Content-Type: image/png");
// Bild-Typ festlegen (damit wird es angezeigt):
imagePNG ($img);
// Bild zerstören:
imageDestroy ($img);
?>