Posts Tagged ‘PHP’

PHP – Redimensionnement automatique d’images et qualité de résultat

// janvier 13th, 2011 // No Comments » // Informatique

Quand un client valide une charte graphique en PSD ou déjà maquettée en HTML, tout est beau. Normal, les photos ont été redimensionnées avec Photoshop.
Il arrive malheureusement très souvent que sur la version dynamique, le rendu n’est pas au rendez-vous. Le client râle parce-que ce n’est pas la qualité qu’il a précédemment validé.
Le classique, quoi.

Avant PHP_GD et sa deuxième version était adaptée et disponible en extension a PHP, le choix était vite fait. Aujourd’hui, les exigences évoluent, la bande passante permet plus de qualité, le web devient largement plus “Multimedia” qu’il y a 5 ans et les “a titre de comparaison” propose des qualités de redimensionnement impressionnantes (Facebook, Flickr …).
Bien évident que PHP_GD n’est plus a la hauteur en terme de qualité. Le rendu est pixelisé et pas besoin d’être un professionnel de la photo pour s’en rendre compte. Ceci même en ajoutant 100 au 3ème paramètre qualité de imagejpeg() :

Image Nenuphars générée par PHP GD

Image Nenuphars générée par PHP GD

Vous trouverez ici, l’image cobaye pour les tests suivants.

La solution du filtre avec imageconvolution()

La plupart des sites dynamiques où les thumbs sont pixelisés s’arrêtent a imagecopyresampled().
Certains malins passent au dessus de l’image généré un filtre obtenue avec une matrice qui atténue la pixelisation en le rendant légèrement flou. Du coup, le résultat n’est pas là.

De plus, cette technique utilise imageconvolution() qui n’est une fonction disponible que si le PHP utilisé a compilé avec GD. Ce qui peux être problematique.

Image Magick

Image Magick

Quand le client a un problème, on a un problème. Et c’est trop facile de se défiler en avançant que “PHP n’est pas Photoshop”, que c’est le maximum que PHP peux faire … Ce qui est aujourd’hui faux et c’est pas les preuves qui manquent.

Je me suis dit, en explorant tous les horizons avec PHP_GD, que la solution est forcément ailleurs. Es-ce qu’il existe une application de traitement d’image en ligne de commande. La réponse est “Oui” : Image Magick.

Comment l’installer sur un debian-like?
sudo apt-get install imagemagick

Voici comment on procède pour un redimensionnement avec Image Magick :
convert -resize 229×172 image_source.jpg image_resultat.jpg
229×172 étant votre taille d’image final. A calculer de manière a conserver les proportions, pour éviter toute déformation.

Image Nenuphars générée par Image Magick sans filtres

Image Nenuphars générée par Image Magick sans filtres

Vous pourrez déjà constater que le résultat est bien meilleur que PHP_GD. Mais ne vous arrêtez pas là, vous pourrez en regardant bien, constater que certains pixels persévérants se distinguent toujours trop, comparé a celui de Photoshop.
Pour lisser encore un peu plus l’image, nous allons appliquer le filtre ‘Cubic’ et un unsharp, sur le resize :
convert -resize 229×172 -filter cubic -unsharp 0×1 image_source.jpg image_resultat.jpg

Image Nenuphars générée par Image Magick avec filtre

Image Nenuphars générée par Image Magick avec filtre

Vous voyez ? Non ? Bon, la première photo, noter résultat de départ et la deuxième, notre résultat après l’amélioration :

Image Nenuphars générée par PHP GD

Image Nenuphars générée par PHP GD

Image Nenuphars générée par Image Magick avec filtre

Image Nenuphars générée par Image Magick avec filtre

Comme on dit, il n’y a pas photo. :)

Reste plus qu’a mettre la commande correcte dans un exec(), dans le code PHP et dynamiser les dimensions du paramètre -resize :

exec( “convert -resize “.$resWidth.”x”.$resHeight.” -filter cubic -unsharp 0×1 “.$imgSrc.” “.$imgRes );

Vous allez me dire : “Mais Image Magick c’est un logiciel a part a installer et on ne peux pas tous les jours installer sur certaines plates-formes, comme dans les mutualisé, par exemple. Et d’ailleurs certains serveur n’acceptent pas la fonction exec()”. Oui, mais chez un hébergeur qui se respecte se doit d’activer la fonction exec() qui me semble quand même bien pratique dans certains cas, mais bien sûr pour un développeur responsable. Quand a Image Magick, détrompez-vous, il est installé dans la plupart des mutualisés. Pour le cas pour OVH, par exemple, vous lancez /usr/bin/convert.

Donc pour résumer, les avantages :

  • Qualité meilleure
  • Gain en poids, 38 Ko contre 46 Ko
  • Conservation de la transparence dans le cas d’un PNG24 doté de transparence (suffit d’ajouter -background transparent) ce qui n’est même pas possible avec PHP_GD.

Et les inconvénients :

  • Vous devez exécuter la commande dans un exec(),  donc bien vérifier les paramètres. Bien qu’il existe une extension PECL,  imagick, si votre serveur n’accepte pas les exec().
  • L’exécution est un chouïa plus lente que PHP_GD

Une fois votre image redimensionnée, il ne vous reste plus qu’a le croper, mais ça, vous conviendrez que ça mérite un autre billet …

PHP, Conversion d’un montant d’une devise à un autre

// août 13th, 2010 // 1 Comment » // Informatique

Pour un projet en interne, un site “portail” malgache, Vectoris a dû trouver un moyen de convertir un montant donné d’une devise à un autre (plus précisément vers l’Ariary noté MGA). Cela paraissait simple au départ et parce-que je me suis dit qu’il devait exister des centaines de WebServices qui pourrait fournir les informations. L’implémentation était en lui même simple mais au moment où il fallait trouver le WebService, je me suis rendu compte que j’étais bien loin du compte.

Pour ce genre de fonctionnalité, le standard semble être WebserviceX, c’est d’ailleurs ce que j’ai mis dans mon Cahier de charges technique. Toutefois, il s’est avéré que le service ne proposait que la devise MGF (que Madagascar a quitté depuis des années pour le MGA), voir la liste des devises supportées, ici. Déjà, ça laisse entrevoir beaucoup de doutes sur la fiabilité du système. De plus, après utilisation, on a remarqué que la valeur retournée est toujours 0 …

Ensuite, on est pasé sur un service de Yahoo, APT, toujours en SOAP. Mais on a remarqué, que le WebService imposait trop de formalités et est trop gros (vraiment orienté finance) pour une aussi petite utilisation. Ça ne convenait pas.

Un peu égaré, j’ai découvert pas mal d’utilisateurs, sur internet, confrontés au même problème et étudiant des solutions disons “beuh” qui consistent a parser les pages web proposant le service:

Pas du tout séduisant. Et puis, tant qu’a “parser”, le faire sur le site de la banque centrale de Madagascar me semblait plus fiable ( du fait que ce site change très rarement, :) ). J’ai réservé cette solution comme dernière alternative.

Je suis ensuite tombé sur un autre petit service de Yahoo, toujours. Celui là permet d’effectuer des conversions qui balance des fichiers CSV et prends en paramètre une chaine de 2 symboles de devises concaténés. L’appel se fait de cette manière : http://quote.yahoo.com/d/quotes.csv?s=EURMGA=X&f=l1&e=.csv

C’est petit, rapide, pile poil ce qu’il fallait, par contre, impossible de changer la valeur (qui n’a d’ailleurs pas de paramètre) et de fichier de sortie. Mais ce n’est pas un problème, juste un file_get_contents et une petite multiplication et c’est parti :

function convertCurrency( $sCurSource, $sCurDest, $fAmount ){
 
	/*
	* Covert $fAmount from $sCurSource to $sCurDest with Yahoo finance
	*/
	$sURLToYahoo = 'http://quote.yahoo.com/d/quotes.csv?s='.$sCurSource.$sCurDest.'=X&f=l1&e=.csv';
	$sResult = file_get_contents( $sURLToYahoo );
 
	return (float)$sResult*$fAmount;
}
 
echo convertCurrency( "EUR", "MGA", 3 );

Si vous copiez-collez, je ne vous ai fait gagner que 3 secondes, le temps nécessaire pour écrire cette fonction. D’ailleurs, il faudra gérer un minimum d’exceptions, dedans. Par contre, remerciez Yahoo.
La question a se poser ensuite concerne la fiabilité des informations reçues et la licence du service … Mais Yahoo n’en parle nulle part …