Traitement des images en PHP
Par Mathieu Delestre le mercredi 6 octobre 2004, 17:03 - Scripts - Lien permanent
!!! Important
2009/07/27 - Portage de la classe ImageFilter vers un ensemble de class plus souple à manipuler
!!! Important
15/03/2005 V1.1a
Nouvelle petite correction trouvé par TeddyBer. pas grand chose, mais ce qu’il faut pour éviter des notices superflue.
14/03/2005 V1.1
Seconde étape de nettoyage avec la remise à jours des commentaires dans le code source de la classe, et au passage, la correction de quelques incohérences de traitements (ne portant pas vraiment à conséquance sauf dans le cas de certaine opérations pas vraiment courantes)
Bref, je vous encourage à mettre à jours vos librairie, mais si tout fonctionne et que les nouvelles fonctionnalités ne vous interressent pas ce n’est pas obligatoire.
13/03/2005 V1.0
Un peu de ménage s’imposait ^^ du coup après une reprise des commentaires disséminé à droite et à gauche relative à cette classe, voila un post tout beau tout neuf ^^.
NB : la classe est compatible GD 1 et 2 (un simple paramètre à changer dans le code source)
06/10/2004
Comme ces derniers temps je fait et refait régulièrement le même genre de tranche de code pour générer des miniatures d’image, ou quelques traitements divers (filtre N/B ou autres) j’ai réuni tout les morceau de code dont je disposais dans une classe unique et j’ai mis au propre l’ensemble.
Au final j’obtient une classe ImageFilter dont la source (et une démo) sont dispo par ici
En éspérant que ça servira à d’autre ^^
Voici la liste des fonctions disponnibles :
setColorsToWork($nb)clear()createImage($w,$h)loadImage($path)getImageSize($img=NULL)output($type='PNG',$JPG_Q=90)
function crop($X,$Y,$WIDTH,$HEIGHT)resize($WIDTH,$HEIGHT,$MODE='force',$EXPAND=false)
fill($x,$y,$r,$g,$b)lightContrast($L=0,$C=0)//$C et L (0-100) Thks to TeddyBernegative()colorize($whiteness, $decalR, $decalG, $decalB)grayscale($taux=1)sepia()
mosaic($wSize, $hSize=0 )stamp($img, $x, $y, $mode='normal' )palettedToTrueColor()
applyMatrix3x3($matrix)// pas bon pour le CPUBlur($k=1)Edge($k=1)Sharpen($k=1)
flip($flip='h')// h,v Thks to ZeuBeuBeurotation($angle=90)// 90,180,270 Thks to ZeuBeuBeu
batchFilter(Array $commands)démo ici
La métode Stamp supporte 6 mode de fusion
- normal = Pix1 <= Pix2
- multiply = Pix1 <= Pix1*Pix2/255 (si Pix2 = 255 = Blanc pas de changement)
- add = Pix1 <= Pix1+Pix2
- difference = Pix1 <= Abs(Pix1-Pix2)
- lighten = Pix1 <= max(Pix1,Pix2)
- darken = Pix1 <= min(Pix1,Pix2)
Commentaires
J’aime bcp, ça ressemble bcp à un truc que j’ai codé y’a pas longtemps zeubeubeu.net/shinobu/
Pitet veux tu qu’on unisse nos efforts et qu’on torche une fonction de "plus net /sharpen" car sur les resize ça le fait (même si on peut faire une transfo bicubique mais trop cpu sucker) ?
effectivement le coup du sharpen ça peut etre très interessant
sinon j’ai bien aimé le coup du flip et rotate… je n’avais pas du tout pensé à ce genre de filtre (pourtant ça peut être très utile)
bonne idée le beubeu je suis partant
tape là mec !
j’ai trouvé ça www.thecodeproject.com/cs… comme base d’algo, faut juste cogiter un peu bcp ^^;;
Hop hop hop j’ai fait une petite maj de la classe afin de gerer des filtres de type matrice 3×3
du coup j’ai réalisé ce 2ème test…
cependant c’est un peu gourmand en ressource machine
Ouais mais SATU ! Merci bcp mon matoo.net, je te ferai une màj pour le flip/rotate
imageFilter
J’ai rajouté deux minables petites fonctions dans la très chouette classe imageFilter de l’ami matoo.net, il ne manque plus…
Salut Matoo,
j’ai une petite question, celle class est elle sous gpl ?
Elle pourrait m’être utile sur une galerie photo sur laquelle je bosse, donc, je te demande l’autorisation de pouvoir éventuellement m’en servir
@++
ben en fait elle n’est sous rien du tout comme licence… je met à disposition la classe et ensuite libre à ceux qui le veulent de l’utiliser dans tout leurs projets ^^
Donc pas de pb utilise la autant que tu le souhaites
Merci
Encore une mise à jours avec cette fois ci l’ajout d’une methode “batchFilter” qui permet de composer un filtre avancé à partir des méthodes de base disponnibles, de préparer tout ça sous la forme d’un tableau, et d’executer le tout via une seule et unique commande
le test ici
SATU !
Erreur ligne 104 et 106 c’est pas $fichier mais $file
Faudrait aussi tester si l’image à créer existe, si c’est le cas, on arrete le script. non ?
oups effectivement il y a une erreur au ligne 104 et 106… je vais corriger ça de suite merci pour l’info
En ece qui concerne la vérification avant écrasement… non pour ma part ma classe effectue ce qu’on lui demande. si on veux verifier alors on le fait soit même (par contre on pourrait ajouter cela de manière optionnel (du genre un param boolean:overwrite)
J’ai trouvé tout ce qu’il me fallait…
Par contre les images que j’obtiens ont perdues beaucoup de qualité. Est ce un problème de version (PHP 4.0.6)?
Si tu sais de quoi ca peut venir…
Merci d’avance
effectivement d’un version à l’autre de php (et donc bien souvent d’une version à l’autre de la lib GD) la qualité n’est pas toujours au top du top
pour ce qui est de la GD compilé avec la 4.06 effectivement c’est surement une des pire que j’ai pu voir… en enregistrement Jpeg on arrive à avoir des images en 2 ou 3 teinte sans même s’en rendre compte oO
Bref une petite mise à jours du serveur s’impose ^^
Pour info (est contre toute attente) les meilleurs résultat que j’ai obtenue sont sous windows avec la GD2.0.26 (je n’ai pas encore trouvé la 2.0.33 en DLL pour PHP sous windows)
Merci…
Je vais essayer avec la version GD 2.0.26…
euh une question : je trouve que le floutage (blur) d’une image augmente énormémet sa luminosité. c’est normal?
et sinon : c’est compliqué à implémenter des fonctions de luminosité/contraste dans cette classe?
tient je viens de trouver ça
//Luminosité :
R := round(R * ( 1 + intens / 100));
G := round(G * ( 1 + intens / 100));
B := round(B * ( 1 + intens / 100));
//Contraste:
R := round(R + in/ 100 * (R-127));
G := round(G + intens / 100 * (G-127));
B := round(B + intens / 100 * (B-127));
Tout est dans la dernière version de la classe ImageFilter
Matoo.net roxor !
!!! nouvelle version (1.1) disponnible cette version corrige des bug introduit suite au petit nettoyage… Comme quoi on est jamais assé attentif.
de plus j’ai corrigé le problème d’éclaircissement de la fonction blur (effectivement y’avait un sérieux soucis)
enfin une nouvelle page de démo en en ligne qui regroupe tout les effets disponibles
ldbglobe.fried-rice.net/_…
mais c’est pas possible! on peut pas sortir des versions tous les jours comme ça sans prévenir! comment qu’ils font après les honnètes gens pour suivre ?!
bon ben je vais récupérer cette version et l’intégrer pour la prochaine version du plugin Toyop (d’ailleurs je t’ai même pas prévenu de sa sortie… www.dotclear.net/forum/vi… )
au fait:
euh sinon, dans la fonction applyMatrix3×3, ligne 684 j’ai changé le test par if(!isset($cols[$r][$g][$b])) parce que sinon, ça me générai des erreurs
et hop j’ai intégré ta correction.
J’ai aussi testé le plugin Toyop et ça tourne superbement bien ^^ beau boulot
Bonjour
Je suis un simple « surfeur », donc pas au niveau requis pour comprendre vos jeux hyper techniques.
Un ami informaticien chilien, (qui ne parle que l’espagnol, oui ça existe), m’avait demandé de lui trouver des infos sur le traitement d’image sous PHP. Je lui ai donc transmis votre code (avec une cht’ite traduction des commentaires parsemant votre œuvre)… Ceci l’a passionné.
Malheureusement il cherchait en priorité une librairie pour générer des dégradés de couleurs et inclure ceux-ci dans des formes tant bitmap que vectorielles (autrement dit un classique pot de peinture).
Sauriez vous où on peut trouver ça ?
Merci
Jean-Claude RIDOLCE
il y à peut être de quoi faire sur le site de "PHP Classes" www.phpclasses.org/
Bonne petite classe, très sympa. Ceci dit, je trouve la convolution 3×3 lente, même sur de petites images !
On peut sûrement faire mieux…
Sinon, il manque une méthode corrélation, qui permettrait par exemple de comparer deux images.
Voilà, sinon, bravo, tu as répondu à mes attentes les plus récentes :D.
ça fait toujours plaisir ^^. Au fait si jamais l’un des "très nombreux" XD utilisateurs de cette classe y apportait des améliorations je suis prenneur pour les intégrer à la source initiale.
Eh bien, donner des méthodes ou en améliorer via un talkback ne me parait pas hyper pratique :s .
Il n’est pas possible de créer un forum ?
Ou trouver une autre méthode ?
Bonjour, je cherche à intégrer dans l’explorer (JBC Explorer) une fonction dans la partie afichage qui fait la rotation vers la droite ou la gauche. Le pb c’est que imagerotate() est inhibé sur Free comme sur 1and1.fr : les deux seuls hébergeurs auxquels j’ai accès ;(.
Je ne vois pas comment intégrer la classe décrite ci-dessus à mon site web. Je débute en PHP et j’essaye de me débrouiller tout seul, mais là je bloque. Si quelqu’un pouvait me contacter sur msn ou autre pour me filer un coup de main ce serait cool.
Merci d’avance.
Astero
Ce sera avec plasir, mais encore faudrait-il savoir comment te contacter… un mail un site, un compte MSN ?
Oops
tu peux me contacter à cette adresse :
Plus besoin donc plus ici / lordbMerci d’avance
Merci bcp Mathieu pour ton aide précieuse.
Ce fut un plaisir
Salut,
Je viens d’intégrer ImageFilter dans mes scripts php pour faire un site web photo.
J’ai trouvé un petit bug : dans la fonction resize :
case ‘ratio’ : //on prend une taille très grand pour ne pas limiter sur la cote non précisé
if($WIDTH===0)
Il faut mettre if($WIDTH==0)
Sinon merci pour ce super script !
a++
Fred
Bah ce n’est pas vraiment un bug si on tient compte du fait que les paramètre sont traité préalablement et ne peuvent contenir que des valeur numérique … donc ==0 ou ===0 ça ne change au fonctionnement ^^
Mais bon je vais corriger ça quand même
Dans le cas assez particulier ou l’on ne spécifie que la hauteur à la fonction resize (0 pour la largeur), avec ce "bug", ça a des effets assez nets ! C’est comme ça que je l’ai vu.
Je viens de mettre mon site photo qui utilise ImageFilter pour créer des miniatures de qualité.
Voici l’adresse pour info : rabut.free.fr
Merci encore
Oups, j’ai oublié la moitié de l’adresse ! C’est : rabut.free.fr/intimites/
a++
Wao, j’arrive un peu tard, mais je suis carrément impressionné par cette classe.
Etant matheux et programmeur, je me suis récemment fixé comme objectif de faire du traitement d’images haut niveau en PHP ( seul language que je connais, et qui me passionne ).
Réencoder le processus de DCT de compression JPG par exemple, ou refaire le processus d’analyse par ondelettes de JPG2000 sont autant d’objectifs passionnants que j’aimerai accomplir, et non tout seul
Je suis très interessé par le travail des personnes qui ont fabriqué cette classe, et j’aimerai prendre contact avec une d’entre elles ( ou plusieurs ), ou avec des personnes intéréssées pour continuer et améliorer cette classe.
Merci de prendre contact avec moi par msn ou mél à
doctorrock83 — at — msn point com.
Hop hop hop ^^ cette classe n’est plus vraiment mise à jour depuis un moment, par contre elle est librement diffusé la seul contrepartie que je demande c’est de poster ici vos éventuelles :
* découverte de bug
* amélioration des fonctions existantes
* implémentation de nouvelles fonctionnalité
* …
Cette classe à été developpé par moi même pour sa plus grande partie, et beubeu qui à apporté sa pierre à l’édifice en me fournissant deux fonctions clé en main ^^.
Il y a également Teddyber qui m’a orienté fort judicieusement lors de la réalisation de la fonction d’ajustement de luminosité et de contraste.
Pour me contacter :
ldbglobe -at- hotmail -point- com
Salut,
J’ai repris la partie de code «sharpen» pour un faire un filtre graphique qui tourne directement sous SPIP 1.9 (système de publication pour l’internet).
Merci beaucoup, je commençais à désespérer de trouver un algorithme de renforcement de la netteté.
Le résultat est présenté là:
www.paris-beyrouth.org/Re…
Bonjour,
Merci pour cette classe la. C'est pratiquement la seule que j'ai trouvé sur le NET.
Est ce que cette classe est compatible avec les effets de saturation et d'explosion/implosion ??
Surement avec la fonction Matrice3x3 mais la ca sort complètement de mon domaine de compétance.
Merci encore pour cette classe.
++
Houla moi je fournit la base mais pour le reste faut quand même coder un peu.
Perso je ne m'en sert quasi exclusivement que pour faire du redimensionnement et de l'incrustation donc...
En l'occurence les effet basé sur la calcul matricielle sont extremement lourd pour un serveur et elle ne sont la que par défis ^^ la saturation doit pouvoir se gérer sur la base de ce qui existe pour le contraste et la luminosité mais pour le reste ça me semble innenvisageable en exploitation réel sur un serveur.
Merci de ta réponse.
Sur le site posterxxl.com on peut faire ces trois effets les extensions de pages osnt en .cgi.
Est ce pareil que le PHP ou est un autre langage a apprendre qui permettrait plus de fonctionnalités.
Merci.