Recherche…


Remarques

Lors de l'utilisation de l'en- header("Content-Type: $mimeType"); et image____ pour générer uniquement une image à la sortie, veillez à ne rien afficher d'autre, notez même une ligne vide après ?> . (Cela peut être un "bug" difficile à détecter - vous n'obtenez aucune image et aucun indice quant à la raison.) Le conseil général est de ne pas inclure?> Du tout ici.

Créer une image

Pour créer une image vierge, utilisez la fonction imagecreatetruecolor :

$img = imagecreatetruecolor($width, $height);

$img est maintenant une variable de ressource pour une ressource image avec $width x $height pixels. Notez que la largeur compte de gauche à droite et que la hauteur compte de haut en bas.

Des ressources d'image peuvent également être créées à partir des fonctions de création d'image , telles que:

  • imagecreatefrompng
  • imagecreatefromjpeg
  • d'autres fonctions imagecreatefrom* .

Les ressources d'image peuvent être libérées plus tard quand il n'y a plus de références à elles. Cependant, pour libérer la mémoire immédiatement (cela peut être important si vous imagedestroy() nombreuses images volumineuses), utiliser imagedestroy() sur une image lorsqu'elle n'est plus utilisée pourrait être une bonne pratique.

imagedestroy($image);

Conversion d'une image

Les images créées par conversion d'image ne modifient pas l'image tant que vous ne l'avez pas sortie. Par conséquent, un convertisseur d'image peut être aussi simple que trois lignes de code:

function convertJpegToPng(string $filename, string $outputFile) {
    $im = imagecreatefromjpeg($filename);
    imagepng($im, $outputFile);
    imagedestroy($im);
}

Sortie d'image

Une image peut être créée en utilisant image* fonctions image* , où * est le format de fichier.

Ils ont cette syntaxe en commun:

bool image___(resource $im [, mixed $to [ other parameters]] )

Enregistrement dans un fichier

Si vous souhaitez enregistrer l'image dans un fichier, vous pouvez transmettre le nom de fichier ou un flux de fichiers ouvert à $to . Si vous passez un flux, vous n'avez pas besoin de le fermer, car GD le fermera automatiquement.

Par exemple, pour enregistrer un fichier PNG, procédez comme suit:

imagepng($image, "/path/to/target/file.png");

$stream = fopen("phar://path/to/target.phar/file.png", "wb");
imagepng($image2, $stream);
// Don't fclose($stream)

Lorsque vous utilisez fopen , veillez à utiliser l'indicateur b plutôt que l'indicateur t , car le fichier est une sortie binaire.

N'essayez pas de lui transmettre fopen("php://temp", $f) ou fopen("php://memory", $f) . Comme le flux est fermé par la fonction après l'appel, vous ne pourrez plus l'utiliser, par exemple pour récupérer son contenu.

Sortie en tant que réponse HTTP

Si vous voulez renvoyer directement cette image comme réponse de l'image (par exemple pour créer des badges dynamiques), vous n'avez pas besoin de passer quoi que ce soit (ou de passer null ) en tant que second argument. Cependant, dans la réponse HTTP, vous devez spécifier votre type de contenu:

header("Content-Type: $mimeType");

$mimeType est le type MIME du format que vous retournez. Les exemples incluent image/png , image/gif et image/jpeg .

Ecrire dans une variable

Il y a deux manières d'écrire dans une variable.

Utiliser l'OB (Sortie Buffering)

ob_start();
imagepng($image, null, $quality); // pass null to supposedly write to stdout
$binary = ob_get_clean();

Utiliser des wrappers de flux

Vous pouvez avoir plusieurs raisons pour lesquelles vous ne souhaitez pas utiliser la mise en mémoire tampon de sortie. Par exemple, vous pouvez déjà avoir OB sur. Par conséquent, une alternative est nécessaire.

En utilisant la fonction stream_wrapper_register , un nouveau stream_wrapper_register flux peut être enregistré. Par conséquent, vous pouvez transmettre un flux à la fonction de sortie d'image et le récupérer ultérieurement.

<?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);

Dans cet exemple, la classe GlobalStream écrit toute entrée dans la variable de référence (c'est-à-dire écrit indirectement dans la variable globale du nom donné). La variable globale peut ensuite être récupérée directement.

Il y a des choses spéciales à noter:

  • Une classe de wrapper de flux entièrement implémentée devrait ressembler à ceci , mais selon les tests avec la méthode magique __call , seuls les stream_open , stream_write et stream_close sont appelés à partir des fonctions internes.
  • Aucun drapeau n'est requis dans l'appel fopen , mais vous devez au moins transmettre une chaîne vide. Cela est dû au fait que la fonction fopen attend un tel paramètre, et même si vous ne l'utilisez pas dans votre implémentation stream_open , une valeur fictive est toujours requise.
  • Selon les tests, stream_write est appelé plusieurs fois. N'oubliez pas d'utiliser .= (Assignation de concaténation), pas = (attribution de variable directe).

Exemple d'utilisation

Dans la <img> HTML <img> , une image peut être fournie directement plutôt que d'utiliser un lien externe:

echo '<img src="data:image/png;base64,' . base64_encode($binary) . '">';

Recadrage et redimensionnement de l'image

Si vous avez une image et que vous souhaitez créer une nouvelle image, avec de nouvelles dimensions, vous pouvez utiliser la fonction imagecopyresampled :

créez d'abord une nouvelle image avec les dimensions souhaitées:

// new image
$dst_img = imagecreatetruecolor($width, $height);

et stocker l'image d'origine dans une variable. Pour ce faire, vous pouvez utiliser l’une des fonctions createimagefrom* où * signifie:

  • jpeg
  • gif
  • png
  • chaîne

Par exemple:

//original image
$src_img=imagecreatefromstring(file_get_contents($original_image_path));

Maintenant, copiez toute (ou partie de) l’image originale (src_img) dans la nouvelle image (dst_img) en imagecopyresampled :

imagecopyresampled($dst_img, $src_img, 
    $dst_x ,$dst_y, $src_x, $src_y, 
    $dst_width, $dst_height, $src_width, $src_height);

Pour définir les src_* et dst_* , utilisez l'image ci-dessous:

entrer la description de l'image ici

Maintenant, si vous souhaitez copier l'intégralité de l'image source (initiale) dans toute la zone de destination (sans recadrage):

$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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow