begin process at 2010 03 22 07:45:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > CSS-GENERATOR

CSS-GENERATOR


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Classé sous :css, generator, sprite, inwebo Niveau :Initié Date de création :02/06/2009 Date de mise à jour :11/06/2009 11:08:18 Vu / téléchargé :3 400 / 221

Auteur : inwebo

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Version Beta Juin 2009

Nécessite les extensions apache : php_zip, GD2
Javascript DOIT être activé !
Compatible IE et FF

Réduisez le nombre de requêtes HTTP sur les images et sauvegardez ainsi votre bande passante. Si vous avez n images à afficher, il vous faudra n requete HTTP, fusionner toutes vos images en une pour obtenir qu'une seule requête. Ce logiciel crée automatiquement l'image ainsi que le css associé.

Extrait de : http://spritegen.website-performance.org/section/w hat-are-css-sprites

"CSS sprites are a way to reduce the number of HTTP requests made for image resources referenced by your site. Images are combined into one larger image at defined X and Y coorindates. Having assigned this generated image to relevant page elements the background-position CSS property can then be used to shift the visible area to the required component image.
This technique can be very effective for improving site performance, particularly in situations where many small images, such as menu icons, are used. The Yahoo! home page, for example, employs the technique for exactly this."


Suite à la lecture de l'excellent article : http://css-tricks.com/css-sprites/ et http://www.smashingmagazine.com/2009/04/27/the-mys tery-of-css-sprites-techniques-tools-and-tutorials /
Et à la découverte de ce service web : http://spritegen.website-performance.org/

Je me suis mis en tête de proposer cette application. Qui nécessite encore quelques modifications !

Source

  • <?php
  • /**
  • * Construction de l'image finale et des régles CSS, en fonction des
  • * paramètres envoyés par le formulaire de index.php5.
  • *
  • * Attention le processus peut prendre du temps, surtout avec moulte images
  • * J'utilise ce service en local, je peux donc augmenter dans la configuration
  • * de php la mémoire allouée a loisir, ce que vous devriez faire si un message
  • * d'erreur survient.
  • *
  • *
  • * @copyright Inwebo
  • * @license http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
  • * @version Mai 2009
  • * @link http://www.phpcs.com/codes/CSS-GENERATOR_50106.aspx
  • * @since Mai 2009
  • */
  • Class makePics{
  • /**
  • * Construction des differentes variables nécessaire à l'application.
  • *
  • *
  • *
  • * @arguments BOOL $css : 1 si le texte ne doit pas être affiché, sinon 0, defaut 0
  • * STRING $rep : Dossier contenant les images à fusionnées
  • * STRING $format : Format de l'image de sortie, defaut PNG, sinon JPG
  • * STRING $colors : Nombre de couleurs de l'image PNG defaut 24bits
  • * INT $qualityJPG : Si le format de sortie est JPG alors entier de 0 a 100
  • * STRING $backColors : Code Hexadecimal d'une couleure, si le champ
  • * back colors du formulaire est remplis, blanc par defaut
  • * BOOL $footer : 1 pour afficher le footer sinon 0, defaut 1
  • * INT $spaceH : Espacement horizontal entre les images fusionnées, par defaut 0
  • * INT $spaceW : Espacement vertical entre les images fusionnées, par defaut 0
  • * INT $widthMax : Largeur de l'image de sortie
  • * STRING $prefixCSS : Nom d'un containaire CSS
  • * STRING $prefix : Prefix CSS de class
  • * STRING $suffix : Suffix CSS de class
  • * ARRAY $dump : Tableau contenant les réponses du programme
  • *
  • * @return VOID
  • */
  • public function __construct($css, $rep, $format = "PNG", $colors = "32", $qualityJPG = '', $backColors = '', $footer = 0, $spaceH = 0, $spaceW = 0,
  • $widthMax = 1024, $prefixCSS = '', $prefix = '', $suffix='') {
  • $this->css = $css;
  • $this->rep = $rep;
  • $this->format = $format;
  • $this->colors = $colors;
  • $this->qualityJPG = $qualityJPG;
  • $this->backColors = $backColors;
  • $this->footer = $footer;
  • $this->spaceH = $spaceH;
  • $this->spaceW = $spaceW;
  • $this->widthMax = $widthMax;
  • $this->backColors = $backColors;
  • $this->prefixCSS = $prefixCSS;
  • $this->prefix = $prefix;
  • $this->suffix = $suffix;
  • $this->largeurFooter = $this->widthMax ;
  • $this->hauteurFooter = 25;
  • if(!empty($this->backColors)) {
  • $colors = makePics::getHex2Rgb($this->backColors);
  • $this->R = $colors['Rouge'];
  • $this->G = $colors['Vert'];
  • $this->B = $colors['Bleu'];
  • }
  • else {
  • $this->R = 255;
  • $this->G = 255;
  • $this->B = 255;
  • }
  • $this->dump = array();
  • $this->dump['Format sortie'] = $this->format;
  • $this->dump['Nombre couleurs sortie'] = $this->colors;
  • $this->dump['Couleur fond sortie'] = $this->backColors;
  • $this->dump['R fond sortie'] = $this->R;
  • $this->dump['G fond sortie'] = $this->G;
  • $this->dump['B fond sortie'] = $this->B;
  • $this->dump['Qualite'] = $this->qualityJPG;
  • makePics::setPics();
  • makePics::setCssCode();
  • //makePics::getDump();
  • }
  • /*
  • * Retourne un tableau de toutes les images contenues dans rep, cad nom, hauteur, largeur, mime type
  • * classé par ordre décroissant de largeur.
  • *
  • * @arguments STRING $path : Dossier à lister
  • *
  • * @static ARRAY $this->dump['All pics'] : ($largeur1, ("f" -> file, "w" -> width, "h" -> height, "t" -> Mime type))
  • * ARRAY $this->dump['Nbr files'] : Nombre d'images totale à traiter
  • * ARRAY $this->dump['All height'] : Toutes les hauteurs disponible
  • *
  • * @return ARRAY $allL : cf $this->dump['All pics'] vers getPicsCoord();
  • */
  • private function getAllPics($path) {
  • // ERROR
  • if(!is_dir($path)) {
  • throw new Exception ('Invalid argument path (1) : ' . $path . ', must be STRING to real folder');
  • }
  • static $allFiles = array();
  • static $allL = array();
  • static $i = 0;
  • static $Hauteur_Dispo = array();
  • static $tableau_elements = array();
  • $dir = opendir($path);
  • // Cette partie vient du site du zero : http://www.siteduzero.com/tutoriel-3-33057-initiation-a-la-recursivite-en-php-notions-mise-en-oeuvre-et-utilisation.html
  • while (($element_dossier = readdir($dir)) !== FALSE)
  • {
  • if ($element_dossier != '.' && $element_dossier != '..' && is_dir($path.'/'.$element_dossier)) {
  • $tableau_elements = array_merge($tableau_elements, self::getAllPics($path.$element_dossier.'/'));
  • }
  • elseif ($element_dossier != '.' && $element_dossier != '..'&& @getimagesize($path . $element_dossier) != 0) {
  • $t = getimagesize($path . $element_dossier );
  • $allFiles[$i] = array( "f" => $path . $element_dossier, "w"=> $t[0], "h"=> $t[1], "t" => $t['mime'] );
  • if(!in_array($t[0], $Hauteur_Dispo)) {
  • $Hauteur_Dispo[] = $t[0];
  • }
  • $allL[$t[0]][] = $allFiles[$i];
  • $i++;
  • }
  • }
  • closedir($dir);
  • $Hauteur_dispo = sort($Hauteur_Dispo);
  • $this->dump['All height'] = $Hauteur_Dispo;
  • $this->dump['Nbr files'] = $i;
  • $this->dump['All pics'] = $allL;
  • ksort($allL);
  • $allL = array_reverse($allL, TRUE);
  • return $allL;
  • }
  • /*
  • * Calcul les coordonnées (x, y) pour chaque image du dossier source, et la taille finale de l'image
  • * (largeur, hauteur)
  • *
  • * @arguments VOID
  • *
  • * @static INT $this->dump['Final pics height'] : Hauteur en pixel de l'image finale
  • * INT $this->dump['Final pics width'] : Largeur en pixel de l'image finale
  • * INT $this->dump['Line'] : Nombre de ligne totale
  • * ARRAY $this->dump['All files coord'] : $endAllFiles
  • *
  • * @return ARRAY $endAllFiles : ('f'=> chemin d'accés a un fichier, 'w' => largeur d un fichier,
  • * 'h'=> hauteur d'un fichier, 't' => mime-type d'un fichier,
  • * 'x'=> coordonnées x pour coller un fichier dans l'image finale,
  • * 'y'=> coordonnées y pour coller un fichier dans l'image finale)
  • *
  • * @NB : L'origine de l'image finale se trouve dans le coin superieur gauche de l'image finale
  • */
  • private function getPicsCoor() {
  • $arrayFiles = makePics::getAllPics($this->rep);
  • $widthMax = $this->widthMax;
  • $lineToken = 0;
  • static $fileNumber = 1;
  • static $heightActualLine = 0;
  • static $widthActualLine = 0;
  • static $totalHeight = 0;
  • static $heightMax = 0;
  • static $x = 0;
  • static $y = 0;
  • $endAllFiles = array();
  • foreach($arrayFiles as $val) {
  • foreach($val as $fval) {
  • $x = $widthActualLine;
  • if($this->css == 1) {
  • $widthActualLine += $fval['w'] + $this->spaceW;
  • }
  • else {
  • $widthActualLine += $fval['w'] + $this->spaceW+100;
  • }
  • $heightActualLine = $fval['h'] + $this->spaceH;
  • if($heightActualLine > $heightMax) {
  • $heightMax = $heightActualLine;
  • }
  • if($widthActualLine <= $widthMax) {
  • $endAllFiles[] = array($fval['f'], $fval['w'], $fval['h'], $fval['t'], $x, $y);
  • }
  • else {
  • $lineToken++;
  • $widthActualLine = 0;
  • $totalHeight += $heightMax;
  • $y += $heightMax;
  • $heightMax = 0;
  • $heightActualLine = 0;
  • }
  • $fileNumber++;
  • if($fileNumber == $this->dump['Nbr files']) {
  • $totalHeight += $heightMax;
  • }
  • }
  • }
  • $this->dump['Final pics height'] = $totalHeight;
  • $this->dump['Final pics width'] = $this->widthMax;
  • $this->dump['Line'] = $lineToken;
  • $this->dump['All files coord'] = $endAllFiles;
  • return $endAllFiles;
  • }
  • /*
  • * Creation de l'image finale dans laquelle nous allons copié toutes les images, selon
  • * sont format et si il y a une couleurs de fond, avec ou sans footer
  • *
  • * @arguments VOID
  • *
  • * @return RESSOURCE image
  • */
  • private function setPicsType() {
  • // Test du nombre de couleurs désiré pour créer une image truecolor si 24bits
  • if($this->colors == "32" || $this->colors != "8") {
  • // Test si le footer doit être présent
  • if($this->footer == 1) {
  • $imageF = imagecreatetruecolor($this->widthMax, $this->dump['Final pics height']+15);
  • $tc = imagecolorallocate($imageF, 255, 255, 255);
  • imagecolortransparent($imageF, $tc);
  • imagestring($imageF, 1, 10, $this->dump['Final pics height']+4, '| Files : ' . $this->dump['Nbr files'] . ' | Width : ' . $this->dump['Final pics width'] . ' | Height : ' . $this->dump['Final pics height'] . ' | By inwebo |', $tc);
  • }
  • else {
  • $imageF = imagecreatetruecolor($this->widthMax, $this->dump['Final pics height']);
  • }
  • }
  • else {
  • $imageF = imagecreate($this->widthMax, $this->dump['Final pics height']);
  • }
  • // PNG transparente
  • if($this->format == "PNG" && $this->backColors == '') {
  • imagealphablending($imageF,false);
  • $col = imagecolorallocatealpha($imageF, 255, 255, 255, 127);
  • imagefilledrectangle($imageF, 0,0 ,$this->widthMax, $this->dump['Final pics height'], $col);
  • imagealphablending($imageF,true);
  • }
  • // PNG avec couleur de fond
  • if($this->format == "PNG" && $this->backColors != '') {
  • imagealphablending($imageF,false);
  • $col = imagecolorallocate($imageF, $this->R, $this->G, $this->B);
  • imagefilledrectangle($imageF, 0,0 ,$this->widthMax, $this->dump['Final pics height'], $col);
  • imagealphablending($imageF,true);
  • }
  • // JPG n'est jamais transparente, couleur par defaut (blanc)
  • if($this->format == "JPG") {
  • imagealphablending($imageF,false);
  • $col = imagecolorallocate($imageF, $this->R, $this->G, $this->B);
  • imagefilledrectangle($imageF, 0,0 ,$this->widthMax, $this->dump['Final pics height'], $col);
  • imagealphablending($imageF,true);
  • }
  • return $imageF;
  • }
  • /*
  • * Fusionne toutes les images du dossier $path (cf getAllPics()), dans une image finale de dimension
  • * transmise par getPicsCoord(), dans une image finale de format $this->format, avec ou sans footer,
  • * avec ou sans couleur de fond ...
  • * (largeur, hauteur)
  • *
  • * @arguments VOID
  • *
  • * @return RESSOURCE image
  • */
  • private function mergeAllPics() {
  • // Toutes les images
  • $endAllFiles = makePics::getPicsCoor();
  • // Notre fond
  • $imageF = makePics::setPicsType();
  • foreach($endAllFiles as $val) {
  • $imgSrc = $val[0];
  • // Parcourt tout notre tableau de fichier a la recherche du mime type
  • switch($val[3]){
  • case 'image/png':
  • $img_src_resource = imagecreatefrompng($imgSrc);
  • break;
  • case 'image/jpg':
  • $img_src_resource = imagecreatefromjpg($imgSrc);
  • break;
  • case 'image/gif':
  • $img_src_resource = imagecreatefromgif($imgSrc);
  • break;
  • }
  • // Si nous voulons rajouter le nom des fichiers à notre image finale
  • if($this->css == 0) {
  • $temp = explode('/', $val[0]);
  • $n = count($temp);
  • $f = explode('.', $temp[$n-1]);
  • $t = $f[0];
  • $tc = imagecolorallocate($imageF, 0, 0, 0);
  • // Un peu du bricolage, colle le texte a droite de notre image avec une marge de 3px
  • imagestring($imageF, 1, $val[4]+3+$val[1], $val[5], $t, $tc);
  • }
  • @imagecopy($imageF, $img_src_resource, $val[4], $val[5], 0, 0, $val[1], $val[2]);
  • }
  • return $imageF;
  • }
  • /*
  • * Sauvegarde l'image finale (renvoyé par mergeAllPics()) dans le format choisis par
  • * l'utilisateur
  • *
  • * @arguments VOID
  • *
  • * @static STRING $this->dump['URL pics'] : url pour telecharger l'image finale
  • *
  • * @return VOID
  • */
  • private function setPics() {
  • // Bricolage, car j'enregistre tout d'abord en PNG puis je la convertie en JPG $this->format == "JPG"
  • $imageF = makePics::mergeAllPics();
  • imagealphablending($imageF,false);
  • imagesavealpha($imageF,true);
  • imagepng($imageF, $this->rep . 'test-big.png');
  • if($this->format == "JPG") {
  • $t = imagecreatefrompng($this->rep . 'test-big.png');
  • imagejpeg($t,$this->rep . 'test-big.jpg', $this->qualityJPG);
  • unlink($this->rep . 'test-big.png');
  • $this->dump['URL pics'] = $this->rep . 'test-big.jpg';
  • }
  • else {
  • $this->dump['URL pics'] = $this->rep . 'test-big.png';
  • }
  • }
  • /*
  • * Affiche toutes les variables de la class pratique pour le debug
  • * @arguments VOID
  • *
  • * @return HTML
  • */
  • public function getDump() {
  • echo'<code><pre>';
  • print_r($this->dump);
  • echo'</code></pre>';
  • }
  • /*
  • * Ecrit dans un fichiers toutes les regles CSS, et les retournes pour affichage
  • *
  • * @arguments VOID
  • *
  • * @return STRING $buffer
  • */
  • private function setCssCode() {
  • $buffer='';
  • foreach($this->dump['All files coord'] as $answer) {
  • $temp = explode('/', $answer[0]);
  • $n = count($temp);
  • $f = explode('.', $temp[$n-1]);
  • $t = $f[0];
  • $buffer .= $this->prefixCSS . '.' . $this->prefix . $t . ' ' . $this->suffix .'{display:block; height:' . $answer[2] . ' px; width:' . $answer[1] . ' px; background-position:-' . $answer[4] . 'px -' . $answer[5] . 'px;}'."\n";
  • }
  • $this->dump['Css'] = $buffer;
  • $file = fopen($this->rep . '/' . 'style.css', "w+");
  • fputs ($file, $buffer);
  • fclose($file);
  • $this->dump['URL Css'] = $this->rep . 'style.css' ;
  • return $buffer;
  • }
  • // Cette fonction est ici : http://us2.php.net/hexdec
  • private function getHex2Rgb($color)
  • {
  • $lColor = strlen($color);
  • if($lColor > 1) {
  • if($color[0] == '#') {
  • $color = substr($color, 1);
  • }
  • }
  • if($lColor == 6) {
  • list($r, $g, $b) = array(
  • $color[0].$color[1],
  • $color[2].$color[3],
  • $color[4].$color[5]
  • );
  • }
  • elseif($lColor == 3) {
  • list($r, $g, $b) = array(
  • $color[0].$color[0],
  • $color[1].$color[1],
  • $color[2].$color[2]
  • );
  • }
  • else {
  • return false;
  • }
  • return array(
  • 'Rouge' => hexdec($r),
  • 'Vert' => hexdec($g),
  • 'Bleu' => hexdec($b)
  • );
  • }
  • }
  • ?>
<?php
/**
 * Construction de l'image finale et des régles CSS, en fonction des
 * paramètres envoyés par le formulaire de index.php5.
 *
 * Attention le processus peut prendre du temps, surtout avec moulte images
 * J'utilise ce service en local, je peux donc augmenter dans la configuration
 * de php la mémoire allouée a loisir, ce que vous devriez faire si un message
 * d'erreur survient.
 *
 *
 * @copyright  Inwebo
 * @license    http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
 * @version    Mai 2009
 * @link       http://www.phpcs.com/codes/CSS-GENERATOR_50106.aspx
 * @since      Mai 2009
 */
 
Class makePics{

	/**
	 * Construction des differentes variables nécessaire à l'application.
	 * 
	 *
	 *
	 * @arguments  BOOL $css 			: 1 si le texte ne doit pas être affiché, sinon 0, defaut 0
	 * 			   STRING $rep 			: Dossier contenant les images à fusionnées
	 *			   STRING $format 		: Format de l'image de sortie, defaut PNG, sinon JPG
	 *			   STRING $colors 		: Nombre de couleurs de l'image PNG defaut 24bits
	 *			   INT $qualityJPG 		: Si le format de sortie est JPG alors entier de 0 a 100
	 *			   STRING $backColors 	: Code Hexadecimal d'une couleure, si le champ
	 * 			   						  back colors du formulaire est remplis, blanc par defaut
	 * 			   BOOL $footer 		: 1 pour afficher le footer sinon 0, defaut 1
	 *			   INT $spaceH 			: Espacement horizontal entre les images fusionnées, par defaut 0
	 *			   INT $spaceW 			: Espacement vertical entre les images fusionnées, par defaut 0
	 *			   INT $widthMax 		: Largeur de l'image de sortie
	 *			   STRING $prefixCSS 	: Nom d'un containaire CSS
	 *			   STRING $prefix 		: Prefix CSS de class
	 *			   STRING $suffix 		: Suffix CSS de class
	 *			   ARRAY $dump			: Tableau contenant les réponses du programme
	 * 
	 * @return     VOID
	 */
	public function __construct($css, $rep, $format = "PNG", $colors = "32", $qualityJPG = '', $backColors = '', $footer = 0, $spaceH = 0, $spaceW = 0,
								 $widthMax = 1024, $prefixCSS = '', $prefix = '', $suffix='') {
		
		$this->css			= $css;
		$this->rep 			= $rep;
		$this->format 		= $format;
		$this->colors 		= $colors;
		$this->qualityJPG 	= $qualityJPG;
		$this->backColors 	= $backColors;
		$this->footer		= $footer;
		$this->spaceH 		= $spaceH;
		$this->spaceW 		= $spaceW;
		$this->widthMax 	= $widthMax;
		$this->backColors	= $backColors;
		$this->prefixCSS	= $prefixCSS;
		$this->prefix		= $prefix;
		$this->suffix		= $suffix;

		$this->largeurFooter = $this->widthMax ;
		$this->hauteurFooter = 25;
		
		if(!empty($this->backColors)) {
			$colors = makePics::getHex2Rgb($this->backColors);
			$this->R = $colors['Rouge'];
			$this->G = $colors['Vert'];
			$this->B = $colors['Bleu'];
		}
		else {
			$this->R = 255;
			$this->G = 255;
			$this->B = 255;	
		}
		
		$this->dump = array();
		
		$this->dump['Format sortie'] = $this->format;
		$this->dump['Nombre couleurs sortie'] = $this->colors;
		$this->dump['Couleur fond sortie'] = $this->backColors;
		$this->dump['R fond sortie'] = $this->R;
		$this->dump['G fond sortie'] = $this->G;
		$this->dump['B fond sortie'] = $this->B;
		$this->dump['Qualite'] = $this->qualityJPG;

		makePics::setPics();
		makePics::setCssCode();

		//makePics::getDump();
	}
	
	/*
	 * Retourne un tableau de toutes les images contenues dans rep, cad nom, hauteur, largeur, mime type
	 * classé par ordre décroissant de largeur.
	 * 
	 * @arguments STRING $path : Dossier à lister
	 *
	 * @static ARRAY $this->dump['All pics']   : ($largeur1, ("f" -> file, "w" -> width, "h" -> height, "t" -> Mime type))
	 *		   ARRAY $this->dump['Nbr files']  : Nombre d'images totale à traiter
	 *		   ARRAY $this->dump['All height'] : Toutes les hauteurs disponible
	 *
	 * @return ARRAY $allL : cf $this->dump['All pics'] vers getPicsCoord();
	 */
	private function getAllPics($path) {
		// ERROR
	   if(!is_dir($path)) {
		    throw new Exception ('Invalid argument path (1) : ' . $path . ', must be STRING to real folder');
		}
		static $allFiles 		 = array();
		static $allL 			 = array();
		static $i 				 = 0;
		static $Hauteur_Dispo 	 = array();
		static $tableau_elements = array();
		
		
	    $dir = opendir($path);
		
		// Cette partie vient du site du zero : http://www.siteduzero.com/tutoriel-3-33057-initiation-a-la-recursivite-en-php-notions-mise-en-oeuvre-et-utilisation.html
        while (($element_dossier = readdir($dir)) !== FALSE)
        {
			if ($element_dossier != '.' && $element_dossier != '..' && is_dir($path.'/'.$element_dossier)) {
				$tableau_elements = array_merge($tableau_elements, self::getAllPics($path.$element_dossier.'/'));
			}
			elseif ($element_dossier != '.' && $element_dossier != '..'&&  @getimagesize($path . $element_dossier) != 0) {
				$t = getimagesize($path .  $element_dossier );
				$allFiles[$i]  = array( "f" => $path . $element_dossier, "w"=> $t[0], "h"=> $t[1], "t" => $t['mime'] );
				if(!in_array($t[0], $Hauteur_Dispo)) {
					$Hauteur_Dispo[] = $t[0];
				}
				$allL[$t[0]][] = $allFiles[$i];
                $i++;
            }
        }
        closedir($dir);
        
 		$Hauteur_dispo = sort($Hauteur_Dispo);
        $this->dump['All height'] 	= $Hauteur_Dispo;
        $this->dump['Nbr files']	= $i;		
		$this->dump['All pics']     = $allL;
		ksort($allL);
		$allL = array_reverse($allL, TRUE);
        return $allL;
	}
	
	/*
	 * Calcul les coordonnées (x, y) pour chaque image du dossier source, et la taille finale de l'image
	 * (largeur, hauteur)
	 * 
	 * @arguments VOID
	 *
	 * @static INT $this->dump['Final pics height'] : Hauteur en pixel de l'image finale
	 *		   INT $this->dump['Final pics width'] : Largeur en pixel de l'image finale
	 *		   INT $this->dump['Line'] : Nombre de ligne totale
	 *		   ARRAY $this->dump['All files coord'] : $endAllFiles
	 *
	 * @return ARRAY $endAllFiles : ('f'=> chemin d'accés a un fichier, 'w' => largeur d un fichier,
	 *								 'h'=> hauteur d'un fichier, 't' => mime-type d'un fichier,
	 *								 'x'=> coordonnées x pour coller un fichier dans l'image finale,
	 *								 'y'=> coordonnées y pour coller un fichier dans l'image finale)
	 * 
	 * @NB : L'origine de l'image finale se trouve dans le coin superieur gauche de l'image finale
	 */
	private function getPicsCoor() {
		$arrayFiles = makePics::getAllPics($this->rep);
		$widthMax   = $this->widthMax;
		$lineToken  = 0;
		static $fileNumber		 = 1;
		static $heightActualLine = 0;
		static $widthActualLine	 = 0;
		static $totalHeight		 = 0;
		static $heightMax 		 = 0;
		static $x = 0;
		static $y = 0;
		$endAllFiles = array();
			foreach($arrayFiles as $val) {
				foreach($val as $fval) {
					$x = $widthActualLine;
					
					if($this->css == 1) {
						$widthActualLine += $fval['w'] + $this->spaceW;
					}
					else {
						$widthActualLine += $fval['w'] + $this->spaceW+100;
					}
					
					$heightActualLine = $fval['h'] + $this->spaceH;

					if($heightActualLine > $heightMax) {
							$heightMax = $heightActualLine;
					}

					if($widthActualLine <= $widthMax) {
						$endAllFiles[] = array($fval['f'], $fval['w'], $fval['h'], $fval['t'], $x, $y);
					}
					else {
						$lineToken++;
						$widthActualLine = 0;
						$totalHeight += $heightMax;
						$y += $heightMax;
						$heightMax = 0;
						$heightActualLine = 0;
					}
					$fileNumber++;
					if($fileNumber == $this->dump['Nbr files']) {
						$totalHeight += $heightMax;
					}
				}
			}

		$this->dump['Final pics height'] = $totalHeight;
		$this->dump['Final pics width'] = $this->widthMax;
		$this->dump['Line'] = $lineToken;
		$this->dump['All files coord'] = $endAllFiles;
		return $endAllFiles;
	}

	/*
	 * Creation de l'image finale dans laquelle nous allons copié toutes les images, selon
	 * sont format et si il y a une couleurs de fond, avec ou sans footer
	 * 
	 * @arguments VOID
	 *
	 * @return RESSOURCE image
	 */
	private function setPicsType() {
		// Test du nombre de couleurs désiré pour créer une image truecolor si 24bits
		if($this->colors == "32" || $this->colors != "8") {
			// Test si le footer doit être présent
			if($this->footer == 1) {
				$imageF = imagecreatetruecolor($this->widthMax, $this->dump['Final pics height']+15);
				$tc = imagecolorallocate($imageF, 255, 255, 255);
				imagecolortransparent($imageF, $tc);
				imagestring($imageF, 1, 10, $this->dump['Final pics height']+4, '| Files : ' . $this->dump['Nbr files'] . ' | Width : ' . $this->dump['Final pics width'] . ' | Height : ' .  $this->dump['Final pics height'] . ' | By inwebo |', $tc);
			}
			else {
				$imageF = imagecreatetruecolor($this->widthMax, $this->dump['Final pics height']);
			}
		}
		else {
			$imageF = imagecreate($this->widthMax, $this->dump['Final pics height']);
		}
		// PNG transparente
		if($this->format == "PNG" && $this->backColors == '') {
			imagealphablending($imageF,false);
			$col = imagecolorallocatealpha($imageF, 255, 255,  255, 127);
			imagefilledrectangle($imageF, 0,0 ,$this->widthMax, $this->dump['Final pics height'], $col);
			imagealphablending($imageF,true);	
		}
		// PNG avec couleur de fond
		if($this->format == "PNG" && $this->backColors != '') {
			imagealphablending($imageF,false);
			$col = imagecolorallocate($imageF, $this->R, $this->G, $this->B);
			imagefilledrectangle($imageF, 0,0 ,$this->widthMax, $this->dump['Final pics height'], $col);
			imagealphablending($imageF,true);
		}
		// JPG n'est jamais transparente, couleur par defaut (blanc)
		if($this->format == "JPG") {
			imagealphablending($imageF,false);
			$col = imagecolorallocate($imageF, $this->R, $this->G, $this->B);
			imagefilledrectangle($imageF, 0,0 ,$this->widthMax, $this->dump['Final pics height'], $col);
			imagealphablending($imageF,true);
		}
		return $imageF;
	}
	
	/*
	 * Fusionne toutes les images du dossier $path (cf getAllPics()), dans une image finale de dimension
	 * transmise par getPicsCoord(), dans une image finale de format $this->format, avec ou sans footer,
	 * avec ou sans couleur de fond ...
	 * (largeur, hauteur)
	 * 
	 * @arguments VOID
	 *
	 * @return RESSOURCE image
	 */
	private function mergeAllPics() {
		// Toutes les images
		$endAllFiles = makePics::getPicsCoor();
		// Notre fond
		$imageF 	 = makePics::setPicsType();
		foreach($endAllFiles as $val) {
			$imgSrc =  $val[0];
			// Parcourt tout notre tableau de fichier a la recherche du mime type
			switch($val[3]){
				case 'image/png':
					$img_src_resource = imagecreatefrompng($imgSrc);
				break;
				
				case 'image/jpg':
					$img_src_resource = imagecreatefromjpg($imgSrc);
				break;
				
				case 'image/gif':
					$img_src_resource = imagecreatefromgif($imgSrc);
				break;
			}
			// Si nous voulons rajouter le nom des fichiers à notre image finale
			if($this->css == 0) {
				$temp = explode('/', $val[0]);
				$n		= count($temp);
				$f 		= explode('.', $temp[$n-1]);
				$t 		= $f[0];
				$tc   	= imagecolorallocate($imageF, 0, 0, 0);
				// Un peu du bricolage, colle le texte a droite de notre image avec une marge de 3px
				imagestring($imageF, 1, $val[4]+3+$val[1], $val[5], $t, $tc);
			}
			@imagecopy($imageF, $img_src_resource, $val[4], $val[5], 0, 0, $val[1], $val[2]);
		}		
		return $imageF;
	}
	
	
	/*
	 * Sauvegarde l'image finale (renvoyé par mergeAllPics()) dans le format choisis par
	 * l'utilisateur
	 * 
	 * @arguments VOID
	 *
	 * @static STRING $this->dump['URL pics'] : url pour telecharger l'image finale
	 * 
	 * @return VOID
	 */
	private function setPics() {
		// Bricolage, car j'enregistre tout d'abord en PNG puis je la convertie en JPG $this->format == "JPG"
		$imageF = makePics::mergeAllPics();
		imagealphablending($imageF,false);
		imagesavealpha($imageF,true);
		imagepng($imageF, $this->rep . 'test-big.png');

		 if($this->format == "JPG") {
		 	$t = imagecreatefrompng($this->rep . 'test-big.png');
		 	imagejpeg($t,$this->rep . 'test-big.jpg', $this->qualityJPG);
		 	unlink($this->rep . 'test-big.png');
		 	$this->dump['URL pics'] = $this->rep . 'test-big.jpg';
		 }
		 else {
		 	$this->dump['URL pics'] = $this->rep . 'test-big.png';
		 }
	}
	
	/*
	 * Affiche toutes les variables de la class pratique pour le debug
	 * @arguments VOID
	 * 
	 * @return HTML
	 */
	public function getDump() {
		echo'<code><pre>';
		print_r($this->dump);
		echo'</code></pre>';
	}
	
	/*
	 * Ecrit dans un fichiers toutes les regles CSS, et les retournes pour affichage
	 * 
	 * @arguments VOID
	 * 
	 * @return STRING $buffer
	 */
	private function setCssCode() {
		$buffer='';
		foreach($this->dump['All files coord'] as $answer) {
			$temp = explode('/', $answer[0]);
			$n = count($temp);
			$f = explode('.', $temp[$n-1]);
			$t = $f[0];
			$buffer .= $this->prefixCSS . '.' . $this->prefix . $t . ' ' . $this->suffix .'{display:block; height:' . $answer[2] . ' px; width:' . $answer[1] . ' px; background-position:-' . $answer[4] . 'px -' . $answer[5] . 'px;}'."\n";
		}
		
		$this->dump['Css'] = $buffer;
		
		$file = fopen($this->rep . '/' . 'style.css', "w+");
		fputs ($file, $buffer);
		fclose($file);
		
		$this->dump['URL Css'] = $this->rep  . 'style.css' ;
		
		return $buffer;
	}
	
	// Cette fonction est ici : http://us2.php.net/hexdec
	private function getHex2Rgb($color)
	{
		$lColor = strlen($color);
		if($lColor > 1) {
			if($color[0] == '#') {
					$color = substr($color, 1);
				}
		}
		if($lColor == 6) {
			list($r, $g, $b) = array(
						$color[0].$color[1],
						$color[2].$color[3],
						$color[4].$color[5]
						);
		}
		elseif($lColor == 3) {
			list($r, $g, $b) = array(
						$color[0].$color[0],
						$color[1].$color[1],
						$color[2].$color[2]
						);
		}
		else {
			return false;
		}
		
		return array(
			'Rouge' => hexdec($r),
			'Vert' => hexdec($g),
			'Bleu' => hexdec($b)
			);
	}

}

?>

 Conclusion

* Attention
* Le traitement d'image peut être relativement gourmand, si vous travaillez en local (ce que je vous
* recommande pour ce logiciel) vous pouvez ajuster la quantité de memoire alloué à PHP.
*
* ;;;;;;;;;;;;;;;;;;;
* ; Resource Limits ;
* ;;;;;;;;;;;;;;;;;;;
*
* memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)
*
* Sur une configuration relativement ancienne, vous pouvez passer a 128 ou plus.

Si vous connaissez un algorithme pour ranger des surfaces en utilisant le minimum de place, je vous écoutes !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

03 juin 2009 16:27:46 :
- Code commenté (Palleas_44 :) ) - Correction mineurs (merci kankrelune)
03 juin 2009 16:28:52 :
- Fausse manip'
08 juin 2009 09:35:26 :
- Correction de code, concaténation de plusieurs echo '' - Correction class Upload private function getExtAllowed() - Passage au while(isset()) pour le parcourt de tableau numérique (Merci Kankrelune)
11 juin 2009 11:08:19 :
- Modification de l'image, tout simplement.

 Sources du même auteur

Source avec Zip Source avec une capture Y.A.P.C. 'YES ANOTHER PICTURES CLASS'
Source avec Zip Source avec une capture FONT 'O' MATIC

 Sources de la même categorie

Source avec une capture DES HISTOGRAMES , CAMEMBERT 3D ET ÉCLATÉS CRÉÉ AU VOL EN PH... par zozo14
AJOUTER UN ARRIÈRE PLAN SUR UNE IMAGE par digitaldax
REDIMENSIONNER UNE IMAGE EN PHP par digitaldax
Source avec Zip RECHERCHE DE MOTIF DANS UNE IMAGE par ParseError
BARRES PARAMÉTRABLES EN DÉGRADÉ DE COULEUR ET AVEC TEXTE DA... par hornetbzz

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Y.A.P.C. 'YES ANOTHER PICTURES CLASS' par inwebo
Source avec Zip Source avec une capture ORGANIGRAMME PHP DYNAMIQUE par megatom
Source avec Zip Source avec une capture FONT 'O' MATIC par inwebo
Source avec Zip CJO - CSS AND JAVASCRIPT OPTIMIZER par x_mec
Source avec Zip Source avec une capture GERER STYLE SITE par ben05

Commentaires et avis

Commentaire de Palleas_44 le 02/06/2009 22:50:35

"Je n'ai pas encore commenté le code, pour l'instant la flemme."
Je n'ai même pas envie de t'aider à corriger des deux/trois trucs qui pourraient être améliorés dans ton code, la flemme. Après tout pourquoi nous on s'embêterait, si toi tu postes ton truc (largement optimisable en plus) à l'arache ?

Commentaire de kankrelune le 02/06/2009 23:57:28

Pourquoi tant de haine dans les commentaires... on est plus en cour de récré il me semble... il a quand même le droit de ne pas avoir ENCORE commenté POUR L'INSTANT... c'est fou ça... encore un commentaire qui ne sert strictement à rien... la prochaine fois autant avoir la flème de commenter... hein... .. . ;o)

Bref... je ne fait que peu de design/intégration et ne connaissais pas le concept... je trouve ça très intéressant... .. .

Pour le code je ne l'ai pas regardé... juste survolé la class makePics...

dans getHex2Rgb() l'utilisation redondante de strlen() ne se justifie pas tu en fait un au début de la méthode tu décrémente si substr() ça suffit...

Evite les foreach() si tu ne travaille pas sur un tableau associatif et si tu n'a pas besoin des clefs remplace les par des for() ou while(isset())

@ tchaOo°

Commentaire de inwebo le 03/06/2009 16:36:00

Pour Palleas_44

Et maintenant es-tu prêt à m'aider ? Oui je pense effectivement qu'il est largement optimisable ce logiciel ! Merci par avance du coup de main.

Pour kankrelune

Tu as tout à fait raison pour getHex2Rgb()! Correction effectuée ! Par contre le second point, je suis plus septique (pour la forme, le fond tu as raison) pour l'utilisation des foreach, apparemment d'après, http://m-fernandez.developpez.com/articles/php/bench/, cela serait la solution la plus rapide pour parcourir un tableau ? Qu'en penses-tu ?

Commentaire de kankrelune le 03/06/2009 18:23:33

Non le plus rapide c'est while(isset()) et ensuite for() le foreach() est plus lent et surtout beaucoup plus lourd car il travaille à partir d'une copie de ton tableau et non à partir de l'original... .. . ;o)

http://m-fernandez.developpez.com/articles/php/bench/#LV-B (c'est le lien que tu me donne, tu as dû mal lire)
http://www.vulgarisation-informatique.com/optimiser-php.php

après ça dépend aussi de la taille du tableau et de ce que tu en fais mais une chose est sûr au dela du temps d'exécution... tu bouffera plus de mémoire avec foreach() car ce dernier crée une copie du tableau pour le parcourir ce qui n'est pas le cas avec while() et for()

@ tchaOo°

Commentaire de BlackDragon le 04/06/2009 02:32:07

kankrelune: "Non le plus rapide c'est while(isset()) et ensuite for() le foreach() est plus lent et surtout beaucoup plus lourd car il travaille à partir d'une copie de ton tableau et non à partir de l'original... .. . ;o)"

pourtant sur les deux sites mentionné, il disent que foreach est le plus rapide

sur http://m-fernandez.developpez.com/articles/php/bench/#LV-B :

"Dans tous les cas, on s'aperçoit que l'utilisation du foreach est nettement plus rapide que les autres, tout particulièrement sur des grands tableaux."

sur http://www.vulgarisation-informatique.com/optimiser-php.php :

"Le while() combiné au list() est plus lent que la fonction foreach() et ce dans tous les cas de figures. Préférez donc l'utilisation du foreach()"



Commentaire de kankrelune le 04/06/2009 11:04:38

while(list() = each()) c'est carément pas pareil que while(isset())...

"Evite les foreach() si tu ne travaille pas sur un tableau associatif et si tu n'a pas besoin des clefs"

while(list() = each()) c'est pour un tableau associatif... isset() est une structure du langage pas each() et list() le temps d'éxécution n'est bien évidement pas le même...

J'avais crue voir un comparatif while() for() foreach() sur des tableaux indexés dans les bench d'Antomicro... mais tu pourra voir que sur le comparatif for()/while()...

"Comme on peut le constater, le while est légèrement plus rapide"

Quand au site de Marc... je cite...

"Le while est comme prévu la façon la plus rapide de faire une boucle mais il est évident qu'au niveau de la lisibilité du code, le for est mieux.

Pour ce qui est du foreach + range, il est à oublier pour principalement 2 raisons :

* si vous souhaitez faire de grosses boucles, vous allez tomber sur une "fatal error" (j'ai augmenté le memory_limit jusqu'à 128Mo mais rien n'y change).
* c'est long, trop long ... environ 3 fois plus qu'un while"

Après le plus simple... c'est que tu teste... remplace tes foreach par...

$i=-1;
while(isset($myArray[++$i]))

et vois quel est le meilleur temps d'exécution et ce qui charge moins la mémoire... .. . ;o)

@ tchaOo°

Commentaire de inwebo le 04/06/2009 11:46:20

Bonjour,

Suite à cette discussion, je viens de faire ce test :

<?php
$nb_occur=100000;

$time_start = microtime(true);
$tablo = array(array('t1_0','t1_1','t1_2','t1_3','t1_4','t1_5','t1_6','t1_7','t1_8'),array('test0','test1','test2','test3','test4','test5','test6','test7','test8'),array('a','b','c','d','e','f','g','h','i'),array('A','B','C','D','E','F','G','H','I'));
for ($i=0 ; $i<$nb_occur; $i++)
{
while( list ($key, $val) = each ($tablo) ) {
while( list ($key2, $val2) = each ($val) ) {

}
}

foreach($tablo as $val) {
foreach($val as $val2) {

}
}

$j = -1;
while(isset($tablo[++$j])) {
$k = -1;
while(isset($tablo[$j][++$k])) {

}
}

$i++;
}

$time_end = microtime(true);
$time = $time_end - $time_start;
$time = str_replace('.',',',$time);
echo '<hr> Durée : '.$time.' secondes<br/>';
?>

Voici trois manières de parcourir un tableau de tableau, j'ai refait le test 5 fois, je ne vous donnes pas les temps d'exécution qui peuvent variés d'une machine à l'autre. La méthodes la plus rapide chez moi est le couple while/list, suivis d'un écart énorme avec while/isset, et de foreach. Ce qui contredit http://www.vulgarisation-informatique.com/optimiser-php.php ? Pouvez-vous infirmer/confirmer avec ce qui se passe chez vous ?

Commentaire de kankrelune le 04/06/2009 12:08:52

Voila ce que j'obtiens avec le code suivant...

for() : 0.0476 s
foreach() : 0.1616 s
while(isset()) : 0.0411 s
while(list() = each()) : 0.3126 s

test sur un tableau de 100.000 entrées

>>>>>>>>>>>

<?php

$testTab = array_pad(array(),100000,0);
echo 'for() : ';
list($usec, $sec) = explode(' ', microtime());
$execStartTime = (float)$sec + (float)$usec;
for($i=0,$len=count($testTab);$i<$len;++$i)
{
    $testTab[$i] = 1;
}
list($usec, $sec) = explode(' ', microtime());
$execStopTime = (float)$sec + (float)$usec;
echo number_format($execStopTime - $execStartTime, 4, '.', ',').' s<br />foreach() : ';
foreach($testTab as $key => $val)
{
    $testTab[$key] = 1;
}
list($usec, $sec) = explode(' ', microtime());
$execStopTime = (float)$sec + (float)$usec;
echo number_format($execStopTime - $execStartTime, 4, '.', ',').' s<br />while(isset()) : ';
list($usec, $sec) = explode(' ', microtime());
$execStartTime = (float)$sec + (float)$usec;
$j = -1;
while(isset($testTab[++$j]))
{
    $testTab[$j] = 1;
}
list($usec, $sec) = explode(' ', microtime());
$execStopTime = (float)$sec + (float)$usec;
echo number_format($execStopTime - $execStartTime, 4, '.', ',').
' s<br />while(list() = each()) : ';
list($usec, $sec) = explode(' ', microtime());
$execStartTime = (float)$sec + (float)$usec;
while(list($key,$val) = each($testTab))
{
    $testTab[$key] = 1;
}
list($usec, $sec) = explode(' ', microtime());
$execStopTime = (float)$sec + (float)$usec;
echo number_format($execStopTime - $execStartTime, 4, '.', ',').' s<br /><br />test sur un tableau de '.number_format(count($testTab),0,',','.').' entr&eacute;es';

?>

@ tchaOo°

Commentaire de kankrelune le 04/06/2009 12:14:15

petite erreur dans le code au niveau du foreach mais le classement reste le même...

for() : 0.0468 s
foreach() : 0.1104 s
while(isset()) : 0.0324 s
while(list() = each()) : 0.3175 s

test sur un tableau de 100.000 entrées

>>>>>>>>>>>>>>>

<?php

function getTime()
{
    list($usec, $sec) = explode(' ', microtime());
    return ((float)$sec + (float)$usec);
}
$testTab = array_pad(array(),100000,0);
echo 'for() : ';
$execStartTime = getTime();
for($i=0,$len=count($testTab);$i<$len;++$i)
{
    $testTab[$i] = 1;
}
$execStopTime = getTime();
echo number_format($execStopTime - $execStartTime, 4, '.', ',').' s<br />foreach() : ';
$execStartTime = getTime();
foreach($testTab as $key => $val)
{
    $testTab[$key] = 1;
}
$execStopTime = getTime();
echo number_format($execStopTime - $execStartTime, 4, '.', ',').' s<br />while(isset()) : ';
$execStartTime = getTime();
$j = -1;
while(isset($testTab[++$j]))
{
    $testTab[$j] = 1;
}
$execStopTime = getTime();
echo number_format($execStopTime - $execStartTime, 4, '.', ',').
' s<br />while(list() = each()) : ';
$execStartTime = getTime();
while(list($key,$val) = each($testTab))
{
    $testTab[$key] = 1;
}
$execStopTime = getTime();
echo number_format($execStopTime - $execStartTime, 4, '.', ',').' s<br /><br />test sur un tableau de '.number_format(count($testTab),0,',','.').' entr&eacute;es';

?>

Commentaire de inwebo le 04/06/2009 14:21:49

D'accord =) !

Merci Kankrelune pour ce conseil, j'utiliserais cette méthode dorénavant pour parcourir mes tableaux numériques !

Commentaire de BlackDragon le 04/06/2009 16:15:09

héhé effectivement kankrelune, merci pour ton exemple, c beaucoup plus clair maintenant dans mon esprit :P

Commentaire de valneandre le 08/06/2009 08:47:40 7/10

Code intéressant, ayant suscité des commentaires intéressants. merci.

Commentaire de kankrelune le 08/06/2009 10:17:21

if($lColor > 1) {
    if($color[0] == '#') {
        $color = substr($color, 1);
    }
}

>>>

if($lColor > 1) {
    if($color[0] == '#') {
        $color = substr($color, 1);
        $lColor--;
    }
}

On remarquera la pertinence de l'intervention de Palleas qui avait tant à nous apprendre... .. .

@ tchaOo°

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

CSS [ par saad123 ] salut je voudrais mettre la couleur d'un tableau dans un fichier .css, g essayé de mettre .green{color:#F3FAED;} puismettre un link dans mon fichier e étirer une image avec du css [ par eax ] bonsoir,je souhaite mettre une image en fond dans un tableau (dans la balise TD). je souhaiterai que cette image soit étirée, qu'elle prenne toute la css et php [ par deer ] bonjour,mon probleme est le suivant.j'affiche une serie d'occurences (depuis une base sql) sur lequelles on peut cliquer pour telecharger un document css [ par snipervali ] Je cherche comment par un style Css a changer la couleur fond et texte de la legende d'une photo par exemple (Sec)...merci d'avanceUn tiens vaut mieux php et css [ par nezdeboeuf62 ] bonjour les ami(e)s!!!!Juste une petite question rapide. Peut generer des css avec du php???(c juste pour eviter que je perde mon tps a essayer de tro css [ par nezdeboeuf62 ] bonjour les amis!!!!Je voulais juste savoir si il y avait moyen de generer une css avec du php??? C juste pr savoir si ca vaut le coup que je cherche css contre table [ par chris81 ] bonjour,voila je me pose une question pour creer un site web, j'aimerais avoir votre avis sur le fait d'utiliser du css ou des tables pour la mise en Comment utiliser les styles css [ par Roc ] Bonjour à tous je commence tout doucement à utiliser php. Un ami m'a conseillé d'utiliser les styles php. En fait c'est pour avoir la meême présentati Url Multiple sur un site à présentation multiple [ par bercal ] Bonjour.Je voudrais réaliser un site sur lequel on pourrait accéder par plusieurs url (exemple : www.machin.com , www.truc.com, www.bidule.com ) sans Problème de Css [ par Waldo2188 ] Salut a tousJe ne savais pas trop ou poser ma question qui porte sur le Css.j'ai pensé que des personne qui fesais du php avais certainement recour a


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
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 : 0,593 sec (3)

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