PHP - Notes perso sur Imagick, un résumé de pourquoi je vire GD à coups de pompes dans l'oignon.
Allez, pour une fois, j'ai un peu de temps devant moi, je vais éplucher un peu la lib Image magick dont je parlais il n'y a guère...
La base
charger UNE image
Simple: pas besoin de plusieurs fonctions selon le format, il suffit de $images = new Imagick('image.jpg');
charger DES images (et là c'est fort)
Même pas nécessaire de passer par un foreach, on fournit le tableau des fichiers voire directement un glob: $images = new Imagick(glob('images/*.JPG'));
Sauver une image
$im->writeImage('image.jpg');
Faire une miniature
Si on laisse une dimension à 0, les proportions sont conservées (quand tu vois la merde que c'est avec GD !)
$image->thumbnailImage(100, 0);
Output une image
header('Content-type: image/jpeg');
$image = new Imagick('image.jpg');
# ici on effectue un traitement puis on sort le résultat
echo $image;
Récupération d'infos sur les images
- taille
$im->getImageWidth() $im->getImageHeight()
- format
$im->getImageFormat()
- 🆒 ⮕ pour fixer le format de l'image, c'est juste
$im->setImageFormat('png');
! 😍 - 📘 on peut fixer le type de compression et l'intensité de celle-ci avec ->setCompression() et ->setCompressionQuality()
- 🆒 ⮕ pour fixer le format de l'image, c'est juste
création d'une nouvelle image
$im->NewImage(largeur,hauteur,couleur de fond);
création d'une couleur
Comme pour GD, il faut créer un objet couleur dans les traitements d'image, mais c'est plus simple qu'avec GD (et plus complet): il suffit de passer une couleur selon les normes CSS. Du coup, la transparence n'est pas gérée par une connerie de paramètre «alpha» mais simplement par ... rgba()... 💖
$couleur=new ImagickPixel("white");
$couleur=new ImagickPixel("#FFF");
$couleur=new ImagickPixel('rgb(255,255,200)');
$couleur=new ImagickPixel('rgba(255,255,200,0.5)');
🆒 ⮕ Ça peut paraître compliqué, mais en fait, dans les fonctions où on est sensé utiliser ImagickPixel, je me suis aperçu qu'on pouvait tout simplement passer une string contenant la couleur css... elles se démerdent seules. 😍
Traitements
Ajouts
- de bordure ->borderImage(couleur,largeur bords verticaux, largeur bords horizontaux):
$im->borderImage(new ImagickPixel("white"), 5, 5);
- de texte :
- ->setFont() :
$im->setFont("example.ttf");
- ->annotateImage(objet ImagiDraw,x,y,angle,texte) : là il faut utiliser un objet ImagiDraw, que je n'ai pas encore regardé: https://www.php.net/manual/fr/class.imagickdraw.php
- ->setFont() :
- de stéganographie (cacher un filigrane dans une image) ->steganoImage():
Modification de couleurs
- sepia ->sepiaToneImage(force) : une valeur raisonnable est 80 (sic)
- solarisation ->solarizeImage(force)
- négatif ->negateImage(gris):
$im->negateImage(0);
- niveaux
$im->normalizeImage();
$im->autoLevelImage();
- gamma ->gammaImage(niveau) :
$im->gammaImage(5);
- contraste
$im->contrastImage(niveau)
- luminosité et contraste
$im->brightnessContrastImage(niveau luminosite, niveau contraste);
- égalisation
$im->equalizeImage()
- coloriser ->colorizeImage(couleur,opacite) :
$im->colorizeImage("red",0.5);
🤬 pas réussi à l'utiliser pour ce test...
Modification de taille et d'orientation
- redimensionner :
- ->resizeImage(largeur,hauteur, filtre, flou) :
$i->resizeImage(250,0,Imagick::FILTER_POINT,0);
- ⭐ note 1: le filtre influe sur la qualité et sur la vitesse: voir https://www.php.net/manual/fr/imagick.resizeimage.php#94493
- 🆒 note 2 : si on laisse une des dimensions à 0, les proportions sont conservées
- ->scaleImage(largeur,hauteur): pas encore compris la différence avec la précédente
- recadrer ->cropImage(largeur,hauteur,x,y):
$im->cropImage(200,200,50,50);
- 💖 créer une miniature à la taille donnée en recadrant l'image autour du centre ->cropThumbnailImage(largeur,hauteur)
- ->resizeImage(largeur,hauteur, filtre, flou) :
- retourner :
$im->flipImage()
pour retourner horizontalement$im->flopImage()
pour retourner verticalement
- pivoter ->rotateimage(color, $angle):
$im->rotateImage(new ImagickPixel('#00000000'), 75);
Modifications de qualité
- modification d'opacité ->setImageOpacity(0-1) :
$im->->setImageOpacity(0.3);
- netteté ->sharpenImage(rayon, deviation,canal):
- amélioration ->enhanceImage()
- flou :
- flou tout court ->blurImage(rayon, décalage):
$im->blurImage(5,2);
- gaussien ->gaussianBlurImage(rayon, deviation) :
$im->gaussianBlurImage(5,2);
- de mouvement ->motionBlurImage(rayon,deviation,angle) :
$im->motionBlurImage(5,5,45);
- flou tout court ->blurImage(rayon, décalage):
- réduction du nombre de couleurs ->posterizeImage(nb de couleurs, 0/1) :
$im->posterizeImage(5,0);
- ajout de bruit ->addNoiseImage(type) :
`$im->addNoiseImage(imagick::NOISE_GAUSSIAN );
voir les constantes de type de bruit
Modification d'aspect et déformations
- aspect crayon
$im->sketchImage(rayon, deviation, angle);
- aspect fusain
$im ->charcoalImage(rayon, deviation);
- aspect emboss ->shadeImage(gris, angle, hauteur):
$im->->shadeImage(1, 90, 2); # emboss + image grisée
$im->shadeImage(0, 90,2) # emboss sur l'image d'origine (couleur)
- peinture à l'huile ->oilPaintImage(rayon) :
$im->oilPaintImage(5);
- détection de bords ->edgeImage(rayon) :
$im->edgeImage(5);
- vagues ->waves(amplitude,longueur):
$im->waveImage( 10, 10);
- déformation ->distortImage(methode, arguments[],0) : voir les constantes de déformation
interactions d'images
- clonage d'une image ->clone():
$imageclonee=$image->clone();
- mélange d'images ->compositeImage($image,composition,x,y,[canal]):
$im->compositeImage($autreimage, imagick::COMPOSITE_OVER, 0, 0);
(la composition, la façon de mélanger les images, peut être une de celles-ci https://www.php.net/manual/fr/imagick.constants.php#imagick.constants.compositeop)
Conclusion
Image Magick me semble particulièrement bien nommée tant les possibilités sont énormes et la simplicité d'utilisation étonnante: on sent une volonté de se simplifier la vie lors de l'utilisation... c'est juste beau.
Je voulais mettre une image de chaque effet dans les descriptions mais:
- ça prenait une place de ouf
- je préfère reprendre certaines de mes applis/api avec imagick
- j'ai plus le temps, les autres arrivent
- j'ai la flemme.
✍ Écrire un commentaire
les commentaires relevant du SPAM seront filtrés et dégagés direct...