Imagerotate

Contenu du snippet

J'ai pour projet depuis un moment de faire un captcha sous forme d'image, j'ai toujours eu peur de le commencer, car la perfection est impossible de ce cote... faut savoir determiner la limite entre protection et accessibilite...
Bon, j'ai commence ce captcha, j'ignore encore si je le terminerais un jours, mais toujours est-il que dans imagerotate, je suis tombe sur ceci :

http://fr.php.net/manual/fr/function.imagerotate.php
Notes
Note: Cette fonction n'est disponible que si PHP est compilé avec la version embarquée de la bibliothèque GD.

j'etais super triste... ca faisait une fonction qui n'existait pas chez moi...

abstraction, quand tu nous prends... J'ai reflechis sur comment faire un truc beau... reponse : faire une fonction similitude, qui tracerait des similitudes directes et indirectes (en fait, ma fonction trace toute similitude sauf les translations...) j'ai donc une fonction qui trace une similitude, a partir d'un centre, d'un angle et d'un rapport...

ces similitudes utilisent des nombres complexes, un complexe est un element de l'ensemble C, et (C, +, *) c'est un corps, on doit donc faire une classe Corps pour faire une classe complexe, car ca permet ensuite d'utiliser un complexe ou un autre nombre pour du calcul qui peut s'effectuer sur tout corps (ouais, ca trouve plus son utilite en java ou en Cpp, mais bon, je trouvais ca beau :) )

J'ai donc une petite demo qui fait un captcha tout pourri, mais qui montre comment utiliser imagerotate meme sur un serveur qui n'a pas la fonction...

Source / Exemple :


<?php
define(pi, 3.141592754);
define(DIRECTE, true);
define(INDIRECTE, false);

Interface Corp{
	//http://fr.wikipedia.org/wiki/Corps_%28math%C3%A9matiques%29
	function plus($a);
	function moins($a);
	function fois($a);
	/*
	function sur($a);
	function getElementNeutrePlus($a);
	function getElementNeutreFois($a);
	function Inverse($a);
	function getElementAbsorbantFois($a);
	function getElementNonInversibleFois($a);
	// on pourrait jouer, mais c'est pas forcement utile si on ne fait pas de framework oriente math :)

  • /
} class Complexe implements Corp{ function __construct($x, $y){ $this->x=$x;$this->y=$y; } function fois($a){ $x=$this->x*$a->getX()-$this->y*$a->getY(); $y=$this->y*$a->getX()+$this->x*$a->getY(); $this->x=$x;$this->y=$y; } function plus($a){ $this->x+=$a->getX(); $this->y+=$a->getY(); } function moins($a){ $this->x-=$a->getX(); $this->y-=$a->getY(); } function barre(){ $this->y*=-1; } function in($a){ return ($this->x > 0 && $this->y > 0 && $this->x < $a->getX() && $this->y < $a->getY()); } function getX(){return $this->x;} function getY(){return $this->y;} private $y; private $x; } if (function_exists('imagerotate')===false){ function imagerotate($img, $angle, $background){ return similitude($img, $angle, 1, $background); } } function similitude($img, $angle, $rapport, $background, $centre=false, $directe=DIRECTE){ $x=imagesX($img); $y=imagesY($img); $imgT=imageCreate($x, $y); imagecopy($imgT, $img, 0, 0, 0, 0, $x, $y); if ($centre===false){ $cx=$x/2; $cy=$y/2; $centre=new Complexe($cx, $cy); } $dim=new Complexe($x, $y); $angle=$angle*pi/180; $angleComplexe=new Complexe(cos(-$angle)/$rapport, sin(-$angle)/$rapport); for ($px=0;$px<$x;$px++){ for ($py=0;$py<$y;$py++){ $c=new Complexe($px, $py); $c->moins($centre); $c->fois($angleComplexe); if ($directe===INDIRECTE){ $c->barre(); } $c->plus($centre); if ($c->in($dim)) imageSetpixel($img, $px, $py, imagecolorAt($imgT, $c->getX(), $c->getY())); else imageSetpixel($img, $px, $py, $background); } } imageDestroy($imgT); return $img; } $texte=str_replace( array('L', '1', '7', '4', 'Q', '0'), array('I', 'I', 'I', 'A', 'O', 'O'), strtoupper(substr(md5(microtime()), 0, 5))); $img=imageCreate(300, 50); $white=imageColorAllocate($img, 255, 255, 255); $black=imageColorAllocate($img, 0, 0, 0); $text_width = imagefontwidth(5); $text_height = imagefontheight(5); for ($i=0;$i<strlen($texte);$i++){ $imgT=imageCreate(50, 50); $a=imageColorAllocate($imgT, 255, 255, 255); imageString($imgT, 5, 25-floor($text_width/2), 25-floor($text_height/2), $texte[$i], $black); //$imgT=imagerotate($imgT, mt_rand(-35, 35), $white); $imgT=similitude($imgT, mt_rand(-35, 35), mt_rand(10, 20)/10, $white); imagecolortransparent($imgT, $a); imagecopy($img, $imgT, $i*50+mt_rand(0, 30)-15, 0, 0, 0, 50, 50); imageDestroy($imgT); } imageRectangle($img, 0, 0, 299, 49, $black); header('Content-Type:image/png'); imagePNG($img); ?>

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.