Advertisement
  1. Code
  2. PHP

Rendern von Text und Formen auf Bildern in PHP

Scroll to top
Read Time: 9 min

German (Deutsch) translation by Ines Willenbrock (you can also view the original English article)

Im vorherigen Artikel haben wir uns auf das Laden und Bearbeiten von Bildern mit PHP konzentriert. Wir haben gelernt, wie man ein Bild dreht, in der Größe, skaliert oder umdreht. Wir lernten auch verschiedene Filter und die Faltungsmatrix kennen. Diese Tutorials behandelten auch einige praktische Anwendungen der GD-Bibliothek, z. B. das Größenänderung aller Bilder in einem Verzeichnis oder das Hinzufügen von Wasserzeichen für mehrere Bilder gleichzeitig.

Neben der Verwendung von GD zum Manipulieren normaler Bilder können wir auch unsere eigenen von Grund auf neu erstellen. Verschiedene Funktionen in der Bibliothek können verwendet werden, um Grundformen wie Ellipsen, Kreise, Rechtecke, Polygone und einfache Linien zu zeichnen. Mit etwas Mathematik können diese Formen schöne Muster erzeugen. Es stehen auch Funktionen zur Verfügung, um Text auf das gerenderte Bild zu zeichnen, was viele Möglichkeiten eröffnet.

In diesem Tutorial erfahren Sie, wie Sie grundlegende Formen in PHP zeichnen und Text mit Ihrer bevorzugten Schriftart rendern.

Zeichnen Sie grundlegende Formen in PHP mit GD

In diesem Abschnitt erfahren Sie mehr über grundlegende Formen und behandeln später Linienstärke, Pinsel und Linienstile.

Zeichnen von Linien

Mit der Funktion imageline($image, $x 1, $y 1, $x 2, $y 2, $color) können Sie eine einfache gerade Linie zwischen zwei angegebenen Punkten zeichnen. Der Parameter $image ist eine Bildressource, die zuvor mit Funktionen wie imagecreatetruecolor() oder imagecreatefromjpeg() erstellt wurde. Wir werden imagecreatetruecolor() in diesem Tutorial verwenden, um neue Bilder von Grund auf neu zu erstellen. Die Funktion zeichnet eine horizontale Linie, wenn $y1 gleich $y2 ist. Ebenso wird eine vertikale Linie ziehe, wenn $x1 gleich $x2 ist.

Zeichnen von Kreisen und Bögen

Die Funktion imagearc($image, $cx, $cy, $width, $height, $start, $end, $color) kann Kreisbögen mit $cx und $cy als Mittelpunkt zeichnen. Die Parameter $width und $height bestimmen die Größe des Bogens auf verschiedenen Achsen. Die Parameter $start und $end geben den Start- und Endwinkel des Bogens in Grad an. Wenn Sie komplette Bögen von 0 bis 360 Grad zeichnen möchten, können Sie die alternative Funktion imageellipse($image, $cx, $cy, $width, $height, $color) verwenden.

Zeichnen von Rechtecken und Polygonen

Mit der Funktion imagerectangle($image, $x1, $y1, $x2, $y2, $color) können Sie Rechtecke über ein Bild zeichnen. Die Werte $x1 und $y1 bestimmen die obere linke Ecke des Rechtecks. Die Werte $x2 und $y2 bestimmen die untere rechte Ecke. Es gibt auch eine imagepolygon($image, $points, $num_points, $color) Funktion, die ein Polygon mit einer beliebigen Anzahl von Seiten oder Punkten erstellen kann. Der Parameter $points ist ein Array, bei dem zwei Elemente miteinander gepaart werden, um die Koordinaten eines bestimmten Punktes abzustellen.

Eine weitere Funktion namens imageopenpolygon() wurde zu PHP 7 hinzugefügt, die keine Linie zwischen dem ersten und letzten Punkt zieht.

Zusammensetzen zum Erstellen einer Zeichnung

Im folgenden Beispiel haben wir all diese Funktionen verwendet, um eine Linienzeichnung mit einer Hütte, der Sonne und dem Boden zu erstellen.

1
<?php
2
3
header("Content-type: image/png");
4
5
$img_width = 800;
6
$img_height = 600;
7
8
$img = imagecreatetruecolor($img_width, $img_height);
9
10
$black = imagecolorallocate($img, 0, 0, 0);
11
$white = imagecolorallocate($img, 255, 255, 255);
12
$red   = imagecolorallocate($img, 255, 0, 0);
13
$green = imagecolorallocate($img, 0, 255, 0);
14
$blue  = imagecolorallocate($img, 0, 0, 255);
15
$orange = imagecolorallocate($img, 255, 200, 0);
16
17
imagefill($img, 0, 0, $white);
18
19
imagerectangle($img, $img_width*2/10, $img_height*5/10, $img_width*4/10, $img_height*8/10, $red);
20
imagerectangle($img, $img_width*4/10, $img_height*5/10, $img_width*8/10, $img_height*8/10, $red);
21
22
imagepolygon($img, [$img_width*3/10, $img_height*2/10, $img_width*2/10, $img_height*5/10, $img_width*4/10, $img_height*5/10], 3, $red);
23
imageopenpolygon($img, [$img_width*3/10, $img_height*2/10, $img_width*7/10, $img_height*2/10, $img_width*8/10, $img_height*5/10], 3, $red);
24
25
imageellipse($img, 100, 100, 100, 100, $orange);
26
imagearc($img, $img_width*3/10, $img_height*8/10, 100, 200, 180, 360, $red);
27
28
imageline($img, 0, $img_height*8/10, $img_width, $img_height*8/10, $green);
29
30
imagepng($img);
31
32
?>

Das Wichtigste hier ist, nur den Wert verschiedener Koordinaten herauszufinden. Ich wollte alles relativ zur Größe des Originalbildes zeichnen, also habe ich die Variablen $img_height und $img_width verwendet, um die Koordinaten verschiedener Punkte zu berechnen.

Line Drawing in PHP GDLine Drawing in PHP GDLine Drawing in PHP GD

Steuern von Liniendicke, Stil und Farbfüllungen

Das obige Bild hat ein paar Probleme wie sehr dünne Linien und keine Färbung. All diese Probleme können mit Funktionen wie imagesetthickness() und imagefilledrectangle() leicht behoben werden.

Linienstärke

Die Funktion imagesetthickness($image, $thickness) legt die Dicke der gerenderten Linien beim Zeichnen von Rechtecken, Polygonen, Bögen usw. fest. Wenn Sie beispielsweise $thickness auf 5 setzen, wird jede Figur, die mit imagerectangle(), imagearc(), imagepolygon() usw. gezeichnet wird, 5 Pixel dick.

Zeichnen gefüllter Formen

Jede Zeichenfunktion hat auch eine gefüllte Farbversion, die diese bestimmte Figur mit einer bestimmten Farbe füllt. Beispielsweise füllt imagefilledrectangle() das gezeichnete Rechteck mit der angegebenen Farbe.

Verwenden von Pinseln

Eine sehr nützliche GD-Funktion ist imagesetbrush($image, $brush). Der Parameter $brush in dieser Funktion ist nur eine weitere Bildressource, mit der Linien gezogen werden können. Zum Beispiel könnten Sie eine transparente Vektorzeichnung einer Blume als Pinsel verwenden, um Ihrem Bild schöne Blumenmuster hinzuzufügen. Das unten angegebene Code-Snippet wurde geschrieben, um das Bild einer Wolke als Pinsel beim Zeichnen eines Punktes zu verwenden. Dies fügt eine einzige Wolke an unserem Himmel hinzu.

1
<?php
2
3
$img = imagecreatetruecolor($img_width, $img_height);
4
5
$clouds = imagecreatefrompng('clouds.png');
6
$clouds = imagescale($clouds, 250);
7
8
imagesetthickness($img, 5);
9
imagesetbrush($img, $clouds);
10
11
imageline($img, $img_width*9/10, 50, $img_width*9/10, 50, IMG_COLOR_BRUSHED);
12
13
?>

Ich habe dieses Wolkenbild auf Pixabay gefunden und auf eine für unser Projekt geeignete Größe herunterskaliert.

Der vollständige Code für das Hüttenbild ist unten angegeben. Wir haben einfach zwei Versionen jeder Figur hinzugefügt, eine zum Zeichnen des Umrisses und die andere zum Ausfüllen der Farbe.

1
<?php
2
3
header("Content-type: image/png");
4
$img_width = 800;
5
$img_height = 600;
6
7
$img = imagecreatetruecolor($img_width, $img_height);
8
9
$clouds = imagecreatefrompng('clouds.png');
10
$clouds = imagescale($clouds, 250);
11
12
imagesetthickness($img, 5);
13
imagesetbrush($img, $clouds);
14
15
$black = imagecolorallocate($img, 0, 0, 0);
16
$white = imagecolorallocate($img, 255, 255, 255);
17
$red   = imagecolorallocate($img, 255, 0, 0);
18
$green = imagecolorallocate($img, 0, 255, 0);
19
$blue  = imagecolorallocate($img, 0, 200, 250);
20
$orange = imagecolorallocate($img, 255, 200, 0);
21
$brown = imagecolorallocate($img, 220, 110, 0);
22
23
imagefill($img, 0, 0, $white);
24
25
imagefilledrectangle($img, 0, 0, $img_width, $img_height*8/10, $blue);
26
27
imagefilledrectangle($img, $img_width*2/10, $img_height*5/10, $img_width*4/10, $img_height*8/10, $red);
28
imagefilledrectangle($img, $img_width*4/10 - 2, $img_height*5/10, $img_width*8/10, $img_height*8/10, $red);
29
30
imagefilledpolygon($img, [$img_width*3/10, $img_height*2/10, $img_width*2/10, $img_height*5/10, $img_width*4/10, $img_height*5/10], 3, $red);
31
imagefilledpolygon($img, [$img_width*3/10, $img_height*2/10, $img_width*7/10, $img_height*2/10, $img_width*8/10, $img_height*5/10, $img_width*4/10, $img_height*5/10], 4, $red);
32
33
imagefilledarc($img, 100, 100, 100, 100, 0, 360, $orange, IMG_ARC_PIE);
34
imagefilledarc($img, $img_width*3/10, $img_height*8/10, 100, 200, 180, 360, $brown, IMG_ARC_PIE);
35
36
imagefilledrectangle($img, 0, $img_height*8/10, $img_width, $img_height, $green);
37
38
imagerectangle($img, $img_width*2/10, $img_height*5/10, $img_width*4/10, $img_height*8/10, $black);
39
imagerectangle($img, $img_width*4/10 - 2, $img_height*5/10, $img_width*8/10, $img_height*8/10, $black);
40
41
imagepolygon($img, [$img_width*3/10, $img_height*2/10, $img_width*2/10, $img_height*5/10, $img_width*4/10, $img_height*5/10], 3, $black);
42
imageopenpolygon($img, [$img_width*3/10, $img_height*2/10, $img_width*7/10, $img_height*2/10, $img_width*8/10, $img_height*5/10], 3, $black);
43
44
imagearc($img, 100, 100, 100, 100, 0, 360, $black);
45
imagearc($img, $img_width*3/10, $img_height*8/10, 100, 200, 180, 360, $black);
46
47
imageline($img, $img_width*9/10, 50, $img_width*9/10, 50, IMG_COLOR_BRUSHED);
48
49
imagerectangle($img, -100, $img_height*8/10, $img_width*11/10, $img_height*11/10, $black);
50
51
imagepng($img);
52
?>

Dies ist das Endergebnis des obigen PHP GD-Codes.

PHP GD Filled Hut ColorPHP GD Filled Hut ColorPHP GD Filled Hut Color

Rendern von Text auf Bildern

PHP GD verfügt über vier verschiedene Funktionen, mit denen Sie entweder mehrere Zeichen oder nur ein Zeichen in horizontaler oder vertikaler Richtung rendern können. Diese Funktionen sind imagechar(), imagecharup(), imagestring() und imagestringup(). Alle von ihnen akzeptieren die gleichen sechs Parameter, also werden wir hier nur die imagechar()-Funktion diskutieren.

Der Parameter $font der Funktion imagechar($image, $font, $x, $y, $string, $color) ist einfach die Größe des gerenderten Textes. Sie akzeptiert nur ganzzahlige Werte von 1 bis 5. Der Parameter $string ist der Text, den Sie wiedergeben möchten. Wenn Sie eine mehrstellige Zeichenfolge an die char-Funktionen übergeben, wird nur das erste Zeichen auf dem Bild gerendert. Die Funktionen imagecharup() und imagestringup() rendern den Text vertikal von unten nach oben.

Wenn es um das Rendern von Text geht, sind die vier Funktionen, die wir oben besprochen haben, sehr begrenzt. Sie werden feststellen, dass selbst der größte Schriftgrößenwert für die normale Verwendung zu klein ist. Außerdem kann der Text nur horizontal und vertikal geschrieben werden.

Glücklicherweise hat GD auch eine imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text) Funktion, die den Text in jeder gewünschten Schriftart rendern kann. Der Parameter $fontfile wird verwendet, um den Pfad zur TrueType-Schriftart anzugeben, die Sie zum Anzeigen des Texts verwenden möchten. Die Parameter $x und $y bestimmen die Ausgangsposition des gerenderten Textes.

Im folgenden Beispiel werden alle diese Funktionen verwendet, um einige schöne Texteffekte zu erstellen.

1
<?php
2
3
header("Content-type: image/png");
4
$img_width = 800;
5
$img_height = 600;
6
7
$img = imagecreatetruecolor($img_width, $img_height);
8
9
$black = imagecolorallocate($img, 0, 0, 0);
10
$white = imagecolorallocate($img, 255, 255, 255);
11
$red   = imagecolorallocate($img, 255, 0, 0);
12
$green = imagecolorallocate($img, 0, 255, 0);
13
$blue  = imagecolorallocate($img, 0, 200, 250);
14
$orange = imagecolorallocate($img, 255, 200, 0);
15
$brown = imagecolorallocate($img, 220, 110, 0);
16
17
imagefill($img, 0, 0, $white);
18
19
imagestringup($img, 5, $img_width*19/20, $img_height*19/20, 'This sentence was written using imagestringup()!', $blue);
20
imagestring($img, 5, $img_width/20, $img_height/20, 'This sentence was written using imagestring()!', $red);
21
22
$passion_one = dirname(__FILE__) . '/PassionOne-Regular.ttf';
23
imagettftext($img, 32, 0, $img_width/20, $img_height*2/10, $black, $passion_one, 'This is Passion One Font!');
24
25
$merriweather = dirname(__FILE__) . '/Merriweather-Regular.ttf';
26
imagettftext($img, 24, 90, $img_width*9/10, $img_height*19/20, $black, $merriweather, 'This is Merriweather Regular Font!');
27
28
$patua_one = dirname(__FILE__) . '/PatuaOne-Regular.ttf';
29
imagettftext($img, 32, 0, $img_width/20, $img_height*3/10 + 2, $black, $patua_one, 'This is Patua One Font!');
30
imagettftext($img, 32, 0, $img_width/20, $img_height*3/10, $orange, $patua_one, 'This is Patua One Font!');
31
32
$monoton = dirname(__FILE__) . '/Monoton-Regular.ttf';
33
imagettftext($img, 72, 0, $img_width/20, $img_height*5.5/10 - 5, $brown, $monoton, 'MONOTON');
34
imagettftext($img, 72, 0, $img_width/20, $img_height*5.5/10 + 5, $orange, $monoton, 'MONOTON');
35
imagettftext($img, 72, 0, $img_width/20, $img_height*5.5/10, $blue, $monoton, 'MONOTON');
36
37
$kaushan = dirname(__FILE__) . '/KaushanScript-Regular.ttf';
38
imagettftext($img, 84, 0, $img_width/20, $img_height*8/10 - 2, $brown, $kaushan, 'Good Night!');
39
imagettftext($img, 84, 0, $img_width/20, $img_height*8/10 + 2, $black, $kaushan, 'Good Night!');
40
imagettftext($img, 84, 0, $img_width/20 - 2, $img_height*8/10, $brown, $kaushan, 'Good Night!');
41
imagettftext($img, 84, 0, $img_width/20 + 2, $img_height*8/10, $black, $kaushan, 'Good Night!');
42
imagettftext($img, 84, 0, $img_width/20, $img_height*8/10, $white, $kaushan, 'Good Night!');
43
44
imagepng($img);
45
?>

Wie Sie sehen können, haben wir den gleichen Text mit der gleichen Schriftart an leicht unterschiedlichen Positionen gerendert, um einige Effekte wie den einfachen Textschatten zu erzeugen. Wichtig zu beachten ist, dass der gerenderte Text, der von einer Textfunktion gerendert wird, den darunter stehenden Text im Falle einer Überlappung vollständig ausblendet. Hier ist das endgültige Bild, das nach dem Ausführen des obigen Codes erhalten wurde.

PHP GD TextPHP GD TextPHP GD Text

Abschließende Gedanken

Das Ziel dieses Tutorials war es, Sie mit verschiedenen GD-Funktionen vertraut zu machen, um grundlegende Formen von Grund auf in PHP zu zeichnen. Mit Hilfe von ein wenig Mathematik können Sie diese Funktionen verwenden, um kompliziertere Formen wie regelmäßige Polygone, abgerundete Rechtecke usw. zu erstellen.

PHP GD hat auch ein paar sehr nützliche Funktionen zum Rendern von Text auf einem Bild. Die Verwendung einer schönen Schriftart stellt sicher, dass der gerenderte Text nicht seltsam aussieht, wenn er auf normalen Bildern platziert wird, die aus verschiedenen Dateipfaden geladen werden.

Haben Sie noch mehr ausgefallene Texteffekte in PHP erstellt? Bitte teilen Sie sie mit uns in den Kommentaren.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.