Accueil > > > IMAGEROTATE
IMAGEROTATE
Information sur la source
Description
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.imagerotat e.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
- <?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);
- ?>
<?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);
?>
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Bug EasyPHP d'urgence !!! [ par Clem ]
Je pose ce message car il y a plus de chances ici que sur le forum easyphp.J'ai un bug avec easyphp. Vous avez certainemant remarqué qu'il y a un bout
Bug EasyPHP d'urgence !!! [ par Clem ]
Je pose ce message car il y a plus de chances ici que sur le forum easyphp.J'ai un bug avec easyphp. Vous avez certainemant remarqué qu'il y a un bout
générer des miniatures avec gd 1.6 [ par vegetaline ]
muhaha alors là c'est rigolo, un super défi pour les programmeurs fous!ok j'ai le code pour générer des miniatures grâce au php, mais ça marche qu'ave
Installation GD 2.0--> Help !! [ par SuperDede ]
comment on fait pour installer GD 2.0 sur apache je suis sous Windows et avec Easy PhPmerci !
PHP et GD [ par sebastienbro ]
Voilà, kestion toute bête, mais je trouve po !Jvoudrai savoir commen on pourrai changer la police d'écriture avec GD, pour l utilisation de imagestrin
Probleme avec GD [ par apz ]
salut,en voulant tester un script sur ma machine j'ai eu l'erreur suivante :Fatal error: imagecreatetruecolor(): requires GD 2.0 or later in c:\progra
Animer texte généré avec GD [ par GxxB ]
Salut tout le monde !Est ce que vous savez si on peut animer un texte généré avec la librairie GD (sachant que je peux exporter l'image en gif à la pl
Librairie GD [ par neocide ]
Pourquoi lorsque je redimensionne une image avec la librairie gd elle est toute laide? Les couleurs ne sont plus les meme et c'est pas beau!il y a t'i
differnec entre php 4 et php5 [ par hardelgylls ]
Bonjourpetite question :j'ai passer un oral et l'examinateur m'a demandé quel était la différence entre php4 et php5. et la gros blanc, est ce que qqu
Doc PHP5 sniff sniff [ par slhuilli ]
Bonjour, Bonsoir,Je suis a la recherche d'un PDF qui recenserait les mots-clefs + explications (bref un bouquin complet) sur PHP 5 qui parait-il est
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|