In meinem vorherigen Tutorial haben wir die grundlegende Bildbearbeitung mit der PHP-GD-Bibliothek besprochen. In diesem Tutorial habe ich eine kurze Einführung in die Bibliothek gegeben und Ihnen gezeigt, wie Sie Bilder aus einer Datei laden oder in PHP von Grund auf neu erstellen. Danach haben wir gelernt, ein Bild mit GD zuzuschneiden, zu drehen, zu skalieren und zu spiegeln. Ich habe das abgedeckt Bildfilter ()
Funktion zum Anwenden verschiedener Filter auf die im Skript geladenen Bildressourcen. Ich habe auch einige nützliche Funktionen in GD erwähnt imagesx ()
und imagesy ()
um die Breite und Höhe des geladenen Bildes zu ermitteln.
Am Ende meines letzten GD-Tutorials haben Sie gelernt, wie Sie mit der Bibliothek grundlegende Aufgaben automatisieren können, z. B. das Ändern der Größe aller Bilder in einem Verzeichnis oder das Anwenden von Filtern wie Graustufen, bevor Sie das Endergebnis speichern. Wenn Sie die PHP-GD-Bibliothek noch nie verwendet haben, würde ich vorschlagen, dass Sie diesen GD-Einführungsartikel lesen, bevor Sie diesen lesen.
In diesem Lernprogramm lernen Sie viele weitere nützliche Funktionen in GD kennen und erfahren, wie diese zur Automatisierung weiterer Bildbearbeitungsaufgaben verwendet werden können.
Mit Ausnahme der Pixel an den Rändern ist jedes Pixel in einem Bild von acht anderen Pixeln umgeben. Effekte wie Unschärfe oder Kantenerkennung werden für jedes Pixel in Abhängigkeit von diesem Pixelwert und den Werten der umgebenden Pixel berechnet. Bei der Kantenerkennung deutet beispielsweise eine scharfe Farbänderung darauf hin, dass wir die Kante eines Objekts im Bild erreicht haben. Zum Beispiel bedeutet ein plötzlicher Wechsel von Weiß zu Braun im Bild unten die Begrenzung des Bechers und des Tisches.
Ein einfacher Weg, diese Art von Filter festzulegen, ist die sogenannte "Faltungsmatrix". GD liefert die Bildkonvolution ($ image, $ matrix, $ div, $ offset)
Funktion zum Anwenden einer 3x3-Faltungsmatrix auf eine Bildressource $ image
.
Das $ Matrix
Parameter ist ein Array von drei Arrays, von denen jedes drei Float-Werte enthält - d. h. es ist eine 3x3-Matrix. Das erste Element des ersten Arrays wird mit dem Farbwert des oberen linken Pixels multipliziert. In ähnlicher Weise wird das zweite Element des ersten Arrays mit dem Farbwert des Pixels direkt auf dem zentralen Pixel multipliziert. Die endgültige Farbe des Pixels wird erhalten, indem das Ergebnis all dieser Multiplikationen addiert und dann durch geteilt wird $ div
zur Normalisierung. Bei der Normalisierung bleibt der endgültige Farbwert im Allgemeinen unter 255.
Wie wir gesehen haben, die $ div
Dieser Parameter wird als Divisor für das Ergebnis der Faltung verwendet, um seinen Wert zu normalisieren. Das $ offset
Mit dem Parameter wird dagegen ein Versatzwert für alle Farben festgelegt. Wie sich dies auf das Endergebnis auswirkt, sehen Sie in den folgenden Beispielen.
Hier sind einige verschiedene Faltungsmatrizen aufgeführt, die wir auf das Bild einer Tasse auf einem Tisch angewendet haben.
$ box_blur = Array ([1, 1, 1], [1, 1, 1], [1, 1, 1]); imageconvolution ($ im_php, $ box_blur, 9, 0);
Bei der Box-Unschärfe wird nur der Durchschnitt jedes Pixels mit seinen Nachbarn gemittelt. Wir setzen den Wert des Divisors auf 9, da die Summe aller Elemente in den drei Arrays 9 ist.
$ Sharpen = Array ([0, -1, 0], [-1, 5, -1], [0, -1, 0]); imageconvolution ($ im_php, $ sharp, 1, 0);
Beim Scharfzeichnen werden die Unterschiede zwischen den einzelnen Pixeln und ihren Nachbarn übertrieben. Dies macht die Kanten etwas klarer. Im Falle des Schärfens ist der Divisor immer noch 1, da die Summe aller Elemente in den drei Arrays 1 ist.
$ emboss = Array ([- 2, -1, 0], [-1, 1, 1], [0, 1, 2]); imageconvolution ($ im_php, $ emboss, 1, 0);
Die Prägematrix ähnelt der Schärfmatrix, mit der Ausnahme, dass die Werte oben links negativ und unten rechts positiv sind. Dadurch wird der Eindruckeffekt erzeugt. Die Summe aller Elemente im Fall der Emboss-Faltungsmatrix beträgt 1, so dass wir uns nicht um Normalisierung oder Farbversatz kümmern müssen.
$ edge_detect = Array ([-1, -1, -1], [-1, 8, -1], [-1, -1, -1]); imageconvolution ($ im_php, $ edge_detect, 1, 0); imageconvolution ($ im_php, $ edge_detect, 1, 255);
Die Kantenerkennung ähnelt der Schärfe, der Effekt ist jedoch noch stärker. Außerdem wird dem ursprünglichen Wert des Bildes nicht mehr Gewicht als den Nachbarn zugewiesen. Dies bedeutet, dass wir uns nur um die Kanten kümmern, nicht um die ursprünglichen einfarbigen Bereiche.
Bei der Kantenerkennung ist die Summe aller Array-Elemente 0. Dies bedeutet, dass das Bild, das wir erhalten, meistens schwarz ist, es sei denn, es kommt zu einer starken Farbänderung, die im Allgemeinen an den Kanten von Objekten auftritt. Das meist schwarze Bild kann in Weiß umgewandelt werden, indem Sie den Versatzparameter auf 255 einstellen.
Das folgende Bild zeigt das Ergebnis all dieser Faltungsmatrizen.
PHP GD hat viele Funktionen, um einen Teil eines Bildes zu kopieren und dann die Größe zu ändern oder es zusammenzuführen. Wenn Sie diese Funktionen verwenden, müssen Sie daran denken, dass PHP die linke obere Ecke einer Bildressource als Ursprung betrachtet. Ein positives x value bringt Sie rechts vom Bild und einen positiven Wert y Wert wird Sie weiter nach unten bringen.
Die einfachste dieser Funktionen ist Bildkopie ($ dst_im, $ src_im, $ dst_x, $ dst_y, $ src_x, $ src_y, $ src_w, $ src_h)
. Das Quellbild wird auf ein Zielbild kopiert. Das $ dst_x
und $ dst_y
Parameter bestimmen die linke obere Ecke, in die das kopierte Bild eingefügt wird. Das $ src_x
, $ src_y
, $ src_w
, und $ src_h
Parameter bestimmen den rechteckigen Teil des Quellbildes, der an das Ziel kopiert wird.
Sie können diese Funktion verwenden, um Bilder zuzuschneiden, indem Sie ein Bild von Grund auf neu erstellen imagecreatetruecolor ()
und Kopieren des Ausschnittrechtecks des Quellbildes hinein. Sie können es auch verwenden, um Wasserzeichen zu Bildern hinzuzufügen. Bei dieser Methode muss jedoch die Größe des Wasserzeichens nicht an die Größe unserer Bilder angepasst werden.
Eine Lösung für dieses Problem ist die Verwendung der Bildkopien ($ dst_im, $ src_im, $ dst_x, $ dst_y, $ src_x, $ src_y, $ dst_w, $ dst_h, $ src_w, $ src_h)
Funktion. Es akzeptiert alle Parameter von Bildkopie ()
und zwei zusätzliche Parameter, um die Größe des Zielbereichs zu bestimmen, in den das Quellbild kopiert werden soll.
Das Bildkopien ()
Die Funktion ist nicht perfekt, da das Bild nicht sehr gut skaliert wird. Mit der können Sie jedoch eine bessere Größenänderung erzielen imagecopyresampled ()
Funktion, die alle gleichen Parameter akzeptiert.
Es gibt zwei weitere Funktionen für das Kopieren von Bildern, die Sie als sehr nützlich erachten: imagecopymerge ()
und imagecopymergegray ()
.
Die Funktion imagecopymerge ($ dst_im, $ src_im, $ dst_x, $ dst_y, $ src_x, $ src_y, $ src_w, $ src_h, $ pct)
ist ähnlich wie Bildkopie ()
, wo die zusätzlichen $ pct
Parameter bestimmt die Transparenz des kopierten Bildes. Ein Wert von 0 bedeutet keine Transparenz, und ein Wert von 100 bedeutet vollständige Transparenz. Dies ist eine große Hilfe, wenn Sie den Inhalt des Hauptbildes nicht vollständig hinter Ihrem Wasserzeichen ausblenden möchten.
Das imagecopymergegray ()
Die Funktion dagegen verwendet den letzten Parameter, um das Quellbild in Graustufen zu konvertieren. Wenn es auf 0 eingestellt ist, verliert das Quellbild seine gesamte Farbe. Wenn es auf 100 eingestellt ist, bleibt das Quellbild davon unberührt.
Das folgende Beispiel verwendet die Bildkopie ()
Funktion, um die rechte Bildhälfte in ein Negativ zu verwandeln. Wir haben bereits andere Funktionen wie besprochen Bildfilter ()
und Imagescale ()
In diesem Code-Snippet des vorherigen Lernprogramms verwendet.
$ im_php = imagecreatefromjpeg ('fish-mosaic.jpg'); $ im_php = Imagescale ($ im_php, 800); $ im_php_inv = Imagescale ($ im_php, 800); $ im_width = imagesx ($ im_php); $ im_height = imagesy ($ im_php); imagefilter ($ im_php_inv, IMG_FILTER_NEGATE); Bildkopie ($ im_php, $ im_php_inv, $ im_width / 2, 0, $ im_width / 2, 0, $ im_width / 2, $ im_height); $ new_name = 'fish-mosaic-half-negate.jpg'; imagejpeg ($ im_php, $ neuer_name);
Hier erstellen wir zwei Kopien des Originalbildes, von denen jede auf 800 Pixel Breite verkleinert wurde. Danach benutzen wir die Bildfilter ()
Funktion zum Erstellen eines Negativs der $ img_php_inv
Bildressource. Die rechte Hälfte dieses Negativbildes wird dann mit der Taste auf das Originalbild kopiert Bildkopie ()
Funktion.
Dies war eine sehr grundlegende Verwendung der Bildkopie ()
Funktion. Sie können die Ergebnisse unten sehen. Sie können das Bild auch in kleinere Abschnitte oder Streifen unterteilen, um interessantere Bildeffekte zu erzeugen. Wir werden die verwenden imagecopymergegray ()
Funktionieren Sie im Code-Snippet unten, um mehr Streifen im ursprünglichen Fischbild zu erzeugen.
$ im_php = imagecreatefromjpeg ('fish-mosaic.jpg'); $ im_php = Imagescale ($ im_php, 800); $ im_php_bw = Imagescale ($ im_php, 800); $ im_width = imagesx ($ im_php); $ im_height = imagesy ($ im_php); $ stripes = 200; für ($ i = 0; $ i < $stripes; $i++) if($i%2 == 0) imagecopymergegray($im_php, $im_php_bw, $i*$im_width/$stripes, 0, $i*$im_width/$stripes, 0, $im_width/$stripes, $im_height, 0); else imagecopymergegray($im_php, $im_php_bw, $i*$im_width/$stripes, 0, $i*$im_width/$stripes, 0, $im_width/$stripes, $im_height, 100); imagefilter($im_php, IMG_FILTER_CONTRAST, -255); imagefilter($im_php, IMG_FILTER_COLORIZE, 250, 0, 0, 100); $new_name = 'fish-mosaic-stripes.jpg'; imagejpeg($im_php, $new_name);
Das obige Codebeispiel verwendet eine ähnliche Strategie wie das vorherige Beispiel, aber dieses Mal haben wir das Bild in kleinere Streifen unterteilt, die in Graustufen umgewandelt werden oder basierend auf dem Wert der Variablen unverändert bleiben $ i
. Nachdem Sie alle Kopiervorgänge abgeschlossen haben, wenden wir zwei Filter auf das Bild an, um die Streifen hervorzuheben.
Das folgende Bild zeigt das Endergebnis dieser beiden Funktionen in Verbindung mit verschiedenen Bildfiltern.
Einige Organisationen fügen ihren Bildern Wasserzeichen hinzu, um deutlich zu machen, dass sie das Bild besitzen. Es hilft auch bei der Markenerkennung und hält andere Personen davon ab, die Bilder eindeutig zu kopieren. Dank PHP GD ist das Wasserzeichen von Bildern eine unkomplizierte Aufgabe.
$ im_php = imagecreatefromjpeg ('waterfall.jpg'); $ wasserzeichen = imagecreatefrompng ('watermark.png'); $ im_width = imagesx ($ im_php); $ im_height = imagesy ($ im_php); $ Wasserzeichen = Bildskala ($ Wasserzeichen, $ im_width / 5); $ wt_width = imagesx ($ wasserzeichen); $ wt_height = Imagesy (Wasserzeichen $); Bildkopie ($ im_php, $ Wasserzeichen, 0,95 * $ im_width - $ wt_width, 0,95 * $ im_height - $ wt_height, 0, 0, $ wt_width, $ wt_height); $ new_name = 'waterfall-watermark.jpg'; imagejpeg ($ im_php, $ neuer_name);
In dem obigen Codeausschnitt haben wir zwei verschiedene Bildressourcen erstellt imagecreatefromjpeg ()
für das Hauptbild und imagecreatefrompng ()
für das Wasserzeichen. Wir bestimmen die Breite und Höhe des Hauptbildes mit imagesx ()
und imagesy ()
Funktionen.
Nicht alle Bilder, die Sie mit einem Wasserzeichen versehen möchten, haben die gleichen Abmessungen. Wenn Sie die Größe des Wasserzeichens nicht basierend auf den Abmessungen des Hauptbilds ändern, kann es komisch aussehen. Ein 200px-Wasserzeichen kann beispielsweise auf einem 1000px-Bild gut aussehen, ist jedoch für ein 600px-Bild zu groß und auf einem 2400px-Bild zu klein.
Deshalb verwenden wir die Imagescale ()
Funktion, um das Wasserzeichen immer auf einem Fünftel der ursprünglichen Bildbreite zu halten. Wir benutzen dann die Bildkopie ()
Funktion, um das Wasserzeichen an der richtigen Stelle zu platzieren. Hier ist das Endergebnis des obigen Code-Snippets.
Neben Wasserzeichen können Sie auch weitere Informationen hinzufügen, z. B. den Ort, an dem ein Foto aufgenommen wurde, oder den Zeitpunkt, zu dem ein Foto aufgenommen wurde.
Nachdem wir in unserem vorherigen Tutorial die Grundlagen der Bildmanipulation behandelt hatten, haben wir einige nützliche Funktionen in der GD-Bibliothek kennengelernt. Im ersten Teil des Tutorials wurde erläutert, wie Sie Bilder in PHP mithilfe der Faltungsmatrix bearbeiten können. Ich habe auch einige Beispiele für die Faltungsmatrix gezeigt, um zu verstehen, wie PHP die Farbwerte verschiedener Pixel erreicht.
Im zweiten Teil des Lernprogramms wurde erläutert, wie Sie einen Teil eines Bildes kopieren und / oder dessen Größe ändern, um es an einer anderen Stelle einzufügen. Dies ist praktisch, wenn wir einem Bild etwas hinzufügen möchten, beispielsweise ein Wasserzeichen oder einen Zeitstempel.
Versuchen Sie, alle diese Funktionen zu verwenden, um einige interessante Bildeffekte zu erzeugen!