PHP
Traitement d'image avec GD
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 lesstream_open
,stream_write
etstream_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 fonctionfopen
attend un tel paramètre, et même si vous ne l'utilisez pas dans votre implémentationstream_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:
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