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, nur stream_open , stream_write und stream_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 die fopen Funktion einen solchen Parameter erwartet, und selbst wenn Sie ihn in Ihrer stream_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_* :

Geben Sie hier die Bildbeschreibung ein

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow