PHP
Bildverarbeitung mit GD
Suche…
Bemerkungen
Bei Verwendung von header("Content-Type: $mimeType");
und image____
nur ein Bild für die Ausgabe zu erzeugen, stellen Sie sicher, dass Sie nichts anderes ausgeben. Beachten Sie auch eine leere Zeile nach ?>
. (Das kann ein schwieriger "Fehler" sein, den man aufspüren kann - man bekommt kein Bild und keine Ahnung, warum.) Der allgemeine Rat ist, hier überhaupt nichts hinzuzufügen.
Bild erstellen
Um ein leeres Bild zu erstellen, verwenden Sie die Funktion imagecreatetruecolor
:
$img = imagecreatetruecolor($width, $height);
$img
ist jetzt eine Ressourcenvariable für eine Bildressource mit $width
x $height
Pixel. Beachten Sie, dass die Breite von links nach rechts und die Höhe von oben nach unten zählt.
Bildressourcen können auch aus Funktionen zum Erstellen von Bildern erstellt werden , z.
-
imagecreatefrompng
-
imagecreatefromjpeg
- andere
imagecreatefrom*
-Funktionen.
Bildressourcen können später freigegeben werden, wenn keine weiteren Verweise darauf vorhanden sind. Um den Speicher jedoch sofort imagedestroy()
(dies kann bei der Verarbeitung vieler großer Bilder wichtig sein), kann die Verwendung von imagedestroy()
für ein Bild, wenn es nicht mehr verwendet wird, eine gute Praxis sein.
imagedestroy($image);
Ein Bild konvertieren
Bilder, die durch Bildkonvertierung erstellt wurden, ändern das Bild nicht, bis Sie es ausgeben. Daher kann ein Bildkonverter aus drei Codezeilen bestehen:
function convertJpegToPng(string $filename, string $outputFile) {
$im = imagecreatefromjpeg($filename);
imagepng($im, $outputFile);
imagedestroy($im);
}
Bildausgabe
Ein Bild kann mit image*
werden , wobei *
das Dateiformat ist.
Sie haben diese Syntax gemeinsam:
bool image___(resource $im [, mixed $to [ other parameters]] )
Speichern in eine Datei
Wenn Sie das Bild in einer Datei speichern möchten, können Sie den Dateinamen oder einen geöffneten Dateistream als $to
. Wenn Sie einen Stream übergeben, müssen Sie ihn nicht schließen, da GD ihn automatisch schließt.
So speichern Sie beispielsweise eine PNG-Datei:
imagepng($image, "/path/to/target/file.png");
$stream = fopen("phar://path/to/target.phar/file.png", "wb");
imagepng($image2, $stream);
// Don't fclose($stream)
fopen
Verwendung von fopen
, dass Sie das Flag b
und nicht das Flag t
verwenden, da die Datei eine binäre Ausgabe ist.
Versuchen Sie nicht , fopen("php://temp", $f)
oder fopen("php://memory", $f)
zu übergeben. Da der Stream nach dem Aufruf von der Funktion geschlossen wird, können Sie ihn nicht weiter verwenden, z. B. um den Inhalt abzurufen.
Ausgabe als HTTP-Antwort
Wenn Sie dieses Bild direkt als Antwort des Bildes zurückgeben möchten (z. B. zum Erstellen dynamischer Badges), müssen Sie als zweites Argument nichts übergeben (oder null
). In der HTTP-Antwort müssen Sie jedoch Ihren Inhaltstyp angeben:
header("Content-Type: $mimeType");
$mimeType
ist der MIME-Typ des Formats, das Sie zurückgeben. Beispiele sind image/png
, image/gif
und image/jpeg
.
In eine Variable schreiben
Es gibt zwei Möglichkeiten, in eine Variable zu schreiben.
Verwendung von OB (Ausgangspufferung)
ob_start();
imagepng($image, null, $quality); // pass null to supposedly write to stdout
$binary = ob_get_clean();
Stream-Wrapper verwenden
Sie haben viele Gründe, warum Sie die Ausgabepufferung nicht verwenden möchten. Beispielsweise haben Sie möglicherweise bereits OB eingeschaltet. Daher ist eine Alternative erforderlich.
Mit der Funktion stream_wrapper_register
kann ein neuer Stream-Wrapper registriert werden. Daher können Sie einen Stream an die Bildausgabefunktion übergeben und später abrufen.
<?php
class GlobalStream{
private $var;
public function stream_open(string $path){
$this->var =& $GLOBALS[parse_url($path)["host"]];
return true;
}
public function stream_write(string $data){
$this->var .= $data;
return strlen($data);
}
}
stream_wrapper_register("global", GlobalStream::class);
$image = imagecreatetruecolor(100, 100);
imagefill($image, 0, 0, imagecolorallocate($image, 0, 0, 0));
$stream = fopen("global://myImage", "");
imagepng($image, $stream);
echo base64_encode($myImage);
In diesem Beispiel schreibt die GlobalStream
Klasse eine beliebige Eingabe in die Referenzvariable (dh indirekt in die globale Variable des angegebenen Namens). Die globale Variable kann später direkt abgerufen werden.
Es gibt einige Besonderheiten zu beachten:
- Eine vollständig umgesetzt Stream - Wrapper - Klasse aussehen sollte dies aber nach Tests mit der
__call
magischen Methode, nurstream_open
,stream_write
undstream_close
werden von internen Funktionen aufgerufen. - Beim
fopen
Aufruf sind keine Flags erforderlich, aber Sie sollten mindestens eine leere Zeichenfolge übergeben. Dies liegt daran, dass diefopen
Funktion einen solchen Parameter erwartet, und selbst wenn Sie ihn in Ihrerstream_open
Implementierung nicht verwenden, ist immer noch ein Dummy-Parameter erforderlich. - Laut Tests wird
stream_write
mehrfach aufgerufen. Denken Sie daran,..=
(Verkettungszuweisung) zu verwenden, nicht=
(direkte Variablenzuweisung).
Verwendungsbeispiel
Im HTML-Tag <img>
kann ein Bild direkt bereitgestellt werden, anstatt einen externen Link zu verwenden:
echo '<img src="data:image/png;base64,' . base64_encode($binary) . '">';
Bildzuschnitt und Größenanpassung
Wenn Sie ein Bild haben und ein neues Bild mit neuen Abmessungen erstellen möchten, können imagecopyresampled
Funktion imagecopyresampled
verwenden:
Erstellen Sie zunächst ein neues image
mit den gewünschten Abmessungen:
// new image
$dst_img = imagecreatetruecolor($width, $height);
und speichern Sie das Originalbild in einer Variablen. Dazu können Sie eine der createimagefrom*
Funktionen verwenden, wobei * für steht:
- jpeg
- gif
- png
- Schnur
Zum Beispiel:
//original image
$src_img=imagecreatefromstring(file_get_contents($original_image_path));
Kopieren Sie nun das gesamte (oder einen Teil) des Originalbilds (src_img) in das neue Bild (dst_img), indem Sie imagecopyresampled
:
imagecopyresampled($dst_img, $src_img,
$dst_x ,$dst_y, $src_x, $src_y,
$dst_width, $dst_height, $src_width, $src_height);
Verwenden Sie das folgende Bild, um die Abmessungen für src_*
und dst_*
:
Wenn Sie nun das gesamte Quellbild (Anfangsbild) in den gesamten Zielbereich kopieren möchten (kein Zuschneiden):
$src_x = $src_y = $dst_x = $dst_y = 0;
$dst_width = $width;// width of new image
$dst_height = $height; //height of new image
$src_width = imagesx($src_img); //width of initial image
$src_height = imagesy($src_img); //height of initial image