begin process at 2012 02 15 21:12:10
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > 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

Source avec une capture IMAGES GENETIQUES
Source avec Zip Source avec une capture RUBIX CUBE
Source avec Zip INTERPRETEUR BRAINFUCK
Source avec Zip PROXY HTTP : SAUVEZ VOS VIDEOS PREFEREES.
Source avec une capture ECRIRE UN TEXTE EN CERCLE SUR UNE IMAGE

 Sources de la même categorie

Source avec Zip Source avec une capture CAMEMBERT BD par dardelphi
Source avec une capture AMÉLIORATION : CAMEMBERT par asphator
GESTION DE COULEUR par manuche
Source avec Zip NAVIGATOR (+CSSDETECTOR) par xXVoxPopuliXx
COMMENT, AVEC GD, DESSINER UN RECTANGLE TRANSPARENT PLEIN AV... par Rainbow

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture MY.BOOKMARKS par inwebo
Source avec Zip M.V.C M.E.D par faceme
Source avec Zip Source avec une capture GÉNÉRATION DE FORMULAIRES HTML PERSONNALISÉS. par beejeridou
FONCTION ROTATION D'UNE IMAGE par zut69
Source avec Zip CLASSE PHP5 D'UPLOAD / REDIMENSIONNEMENT D'IMAGE GD par littlewings

Commentaires et avis

Commentaire de neigedhiver le 30/05/2007 15:12:28

C'est joli et propre.
Mais... si je puis me permettre, pour chipoter, ta valeur de pi est incorrecte...
3.141592653589793... Mais Wikipedia en sait plus que moi...

Commentaire de coucou747 le 30/05/2007 15:42:24 administrateur CS

ma valeur de pi, je l'ai sortie de tete, pardonne moi...

Commentaire de skyrock55 le 03/07/2007 19:53:30

Utilise la constante M_PI tu aura une valeur plutot présice sans te casser la tete

Commentaire de coucou747 le 20/07/2007 14:45:28 administrateur CS

pour ceux qui auraient des problemes de palette de couleurs, ils devraient appliquer imageCreateTrueColor et non imageCreate.

Commentaire de ramsou le 12/11/2007 13:30:42

Salut,

chez moi ca fonctionne pas j'ai une erreur avec Interface Corp.Par rapport à ton code j'ai "parse error in ...line 6".

Merci

Commentaire de coucou747 le 12/11/2007 18:04:11 administrateur CS

t'es en php4.... mate le titre de la source, faut au moins php5... (serieux, lit avant de dire une chose pareille...)

 Ajouter un commentaire


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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,699 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales