PHP 8.1.31 Released!

Utilisation simple

Imagick rend la manipulation des images via PHP extrêmement facile grâce à une interface orientée objet. Voici un exemple rapide illustrant la création d'une miniature :

Exemple #1 Création d'une miniature avec Imagick

<?php

header
('Content-type: image/jpeg');

$image = new Imagick('image.jpg');

// Si 0 est fourni comme paramètre de hauteur ou de largeur,
// les proportions seront conservées
$image->thumbnailImage(100, 0);

echo
$image;

?>

En utilisant SPL ou tout autre fonctionnalité orientée objet supportée par Imagick, il devient simple de redimensionner tous les fichiers d'un dossier (utile pour des scripts batch redimensionnant des images issues d'un appareil photo numérique afin de les rendre lisibles sur le web). Voici un exemple de redimensionnement de toutes les images JPG d'un dossier, tout en conservant les métadonnées :

Exemple #2 Création de miniature de toutes les images JPG d'un dossier

<?php

$images
= new Imagick(glob('images/*.JPG'));

foreach(
$images as $image) {

// On fournit 0 en guise de paramètre afin de conserver les proportions
$image->thumbnailImage(1024,0);

}

$images->writeImages();

?>

Voici un exemple permettant de créer le reflet d'une image. Ce reflet est créé en retournant l'image et en y ajoutant un dégradé. Ensuite, l'image original et son reflet sont ajoutés dans une nouvelle image.

Exemple #3 Création d'un reflet sur une image

<?php
/* Lecture de l'image */
$im = new Imagick("test.png");

/* Création d'une miniature de l'image */
$im->thumbnailImage(200, null);

/* Création d'une bordure */
$im->borderImage(new ImagickPixel("white"), 5, 5);

/* Clône l'image et on la retourne */
$reflection = $im->clone();
$reflection->flipImage();

/* Création du dégradé. Il sera ajouté à l'image retournée */
$gradient = new Imagick();

/* Le dégradé doit être assez large pour l'image et ses bordures */
$gradient->newPseudoImage($reflection->getImageWidth() + 10, $reflection->getImageHeight() + 10, "gradient:transparent-black");

/* Ajout du dégradé sur l'image retournée */
$reflection->compositeImage($gradient, imagick::COMPOSITE_OVER, 0, 0);

/* Ajout d'un peu d'opacité. Nécessite ImageMagick 6.2.9 ou supérieur */
$reflection->setImageOpacity( 0.3 );

/* Création d'une image vide */
$canvas = new Imagick();

/* L'image vide doit être assez large pour contenir les 2 images */
$width = $im->getImageWidth() + 40;
$height = ($im->getImageHeight() * 2) + 30;
$canvas->newImage($width, $height, new ImagickPixel("black"));
$canvas->setImageFormat("png");

/* Ajout de l'image originale et de l'image retournée dans notre nouvelle image */
$canvas->compositeImage($im, imagick::COMPOSITE_OVER, 20, 10);
$canvas->compositeImage($reflection, imagick::COMPOSITE_OVER, 20, $im->getImageHeight() + 10);

/* Affichage de l'image */
header("Content-Type: image/png");
echo
$canvas;
?>

Résultat de l'exemple ci-dessus est similaire à :

Affichage de l'exemple : Création d'un reflet sur une image

Voici un exemple montrant comment remplir un masque lors du dessin de l'image.

Exemple #4 Remplissage d'un texte avec un dégradé

<?php

/* Création d'un nouvel objet imagick */
$im = new Imagick();

/* Création d'une nouvelle image. Elle sera utilisée comme masque de remplissage */
$im->newPseudoImage(50, 50, "gradient:red-black");

/* Création d'un nouvel objet imagickdraw */
$draw = new ImagickDraw();

/* On commence un nouveau masque nommé "gradient" */
$draw->pushPattern('gradient', 0, 0, 50, 50);

/* Ajout du dégradé sur le masque */
$draw->composite(Imagick::COMPOSITE_OVER, 0, 0, 50, 50, $im);

/* Fermeture du masque */
$draw->popPattern();

/* Utilisation du masque nommé "gradient" comme remplissage */
$draw->setFillPatternURL('#gradient');

/* Définition de la taille du texte à 52 */
$draw->setFontSize(52);

/* Ajout d'un texte */
$draw->annotation(20, 50, "Bonjour le monde !");

/* Création d'un nouvel objet et d'une image blanche */
$canvas = new Imagick();
$canvas->newImage(350, 70, "white");

/* Dessine le ImagickDraw sur la nouvelle image */
$canvas->drawImage($draw);

/* Une bordure noire d'un pixel autour de l'image */
$canvas->borderImage('black', 1, 1);

/* Définition du format à PNG */
$canvas->setImageFormat('png');

/* Affiche l'image */
header("Content-Type: image/png");
echo
$canvas;
?>

Résultat de l'exemple ci-dessus est similaire à :

Affichage de l'exemple : Remplissage d'un texte avec un dégradé

Exemple avec des images GIF animées

Exemple #5 Lit une image GIF et redimensionne toutes les frames

<?php

/* Crée un nouvel objet imagick et lit une image GIF */
$im = new Imagick("example.gif");

/* Redimensionne toutes les frames */
foreach ($im as $frame) {
/* 50x50 frames */
$frame->thumbnailImage(50, 50);

/* Définit le canevas virtuel à la bonne taille */
$frame->setImagePage(50, 50, 0, 0);
}

/* Notez l'utilisation de writeImages au lieu de writeImage */
$im->writeImages("example_small.gif", true);
?>

Exemple avec des ellipses primitives et des polices personalisées

Exemple #6 Create a PHP logo

<?php
/* Définit la largeur et la hauteur en proportion du logo PHP */
$width = 400;
$height = 210;

/* Crée un objet Imagick avec une toile transparent */
$img = new Imagick();
$img->newImage($width, $height, new ImagickPixel('transparent'));

/* Nouvelle instance ImagickDraw pour dessiner l'ellipse */
$draw = new ImagickDraw();
/* Définit la couleur violette pour remplir l'ellipse */
$draw->setFillColor('#777bb4');
/* Définit les dimensions de l'ellipse */
$draw->ellipse($width / 2, $height / 2, $width / 2, $height / 2, 0, 360);
/* Dessine l'ellipse dans la toile */
$img->drawImage($draw);

/* Réinitialise la couleur de remplissage, passant du violet au noir pour le texte (note : nous ré-utilisons l'objet ImagickDraw) */
$draw->setFillColor('black');
/* Définit à blanc la couleur du trait de la bordure */
$draw->setStrokeColor('white');
/* Rend plus fin le trait de la bordure */
$draw->setStrokeWidth(2);
/* Définit le crénage de la police (une valeur négative signifie que les lettres sont proches les unes des autres) */
$draw->setTextKerning(-8);
/* Définit la police et sa taille à utiliser dans le logo PHP */
$draw->setFont('Handel Gothic.ttf');
$draw->setFontSize(150);
/* On centre le texte horizontalement et verticalement */
$draw->setGravity(Imagick::GRAVITY_CENTER);

/* Ajout de "php" au centre, avec une position en Y de -10 dans la toile (à l'intérieur de l'ellipse) */
$img->annotateImage($draw, 0, -10, 0, 'php');
$img->setImageFormat('png');

/* On définit l'en-tête approprié pour le PNG et on affiche l'image */
header('Content-Type: image/png');
echo
$img;
?>

Résultat de l'exemple ci-dessus est similaire à :

Affichage de l'exemple : Création d'un logo PHP avec Imagick

add a note

User Contributed Notes 2 notes

up
36
vokseli
10 years ago
Be careful when loading multiple images by passing an array to a new Imagick object. This is from Example #2:

<?php

$images
= new Imagick(glob('images/*.JPG'));

?>

If you have lots of images inside the images folder, PHP will consume a lot of memory, ergo it is not recommended. I personally think it's a better idea to loop each image separately:

<?php

$image_files
= glob('images/*.JPG');

foreach (
$image_files as $image_file) {
$image = new Imagick($image_file);
// Do something for the image and so on...
}

?>

This way only a single image is fitted into the memory at a time.
up
18
inoshadi at gmail dot com
10 years ago
on Example #3 Creating a reflection of an image
----------------------------------------------------
/* Clone the image and flip it */
$reflection = $im->clone();
$reflection->flipImage();
----------------------------------------------------
it was using the Imagick::clone function

This function has been DEPRECATED as of imagick 3.1.0 in favour of using the clone keyword.

use below code instead:
----------------------------------------------------
/* Clone the image and flip it */
$reflection = clone $im;
$reflection->flipImage();
----------------------------------------------------

http://php.net/manual/en/imagick.clone.php
To Top