begin process at 2012 05 27 22:18:42
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > CLASSE DE REDIMENSIONNEMENT D'IMAGES PHP

CLASSE DE REDIMENSIONNEMENT D'IMAGES PHP


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :classe php, redimensionnement, images, traitement, upload Niveau :Initié Date de création :18/05/2010 Date de mise à jour :10/06/2010 10:50:38 Vu / téléchargé :4 705 / 532

Auteur : beejeridou

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

 Description

Bonjour,

Comme promis, voici ma classe de redimensionnement d'images couplée à celle d'upload de fichiers.

3 types de redimensionnement: l'homothétie, le crop (carré ou rectangle), le wallpaper.

Lors d'un redimensionnement, le script essaye de centrer au maximum la zone en fonction si l'image source est de type portrait ou paysage.

Lors d'un redimensionnement de type "homothety", si on précise largeur+hauteur, le redimensionnement prendra la taille correspondante si l'image source est de type portrait ou paysage. Dans le cas contraire, l'image prendra toujours la largeur comme référence.

Par défaut, si le redimensionnement demandé est plus grand que l'image source, afin de ne pas dégrader la qualité de l'image, le redimensionnement ne se fait pas... sauf si on déclare la méthode : setForceDimensions();

La methode setDeleteSource() permet de supprimer l'image source afin de ne garder que les images redimensionnées.

La gestion du memory_limit imposé par le serveur est gérée. En effet, votre image source peut contenir "trop" de pixels tout en étant inférieure au poids limite. Si ce cas est rencontré (j'ai testé avec une image de 2000px de large), l'image source sera redimensionnée à 1000px pour les traitements des vignettes suivantes.
Ce calcul est effectué grâce au 3ème paramètre du constructeur. C'est le nombre de redimensionnements que l'on compte effectuer. Ce calcul se base sur un memory_limit de 32MO que vous pouvez changer avec la methode setMemoryLimit().
La méthode setMemoryUsed() affiche la mémoire utilisée par le script (en Mo).

Si vous avez des questions... j'avoue que mon explication peut être zarbi.

Executez class.ImageResize.php sur votre serveur pour utiliser l'exemple qui se trouve tout en bas.

Vous devez bien entendu être en PHP5 et avoir activé la bibliothèque GD(2).

Source

  • <?php
  • class ImageResize {
  • private $memoryUsed = false;
  • private $infosDebug;
  • private $droits = 0777;
  • private $memoryLimit = 32;
  • private $pathSource;
  • private $imgNameSource;
  • private $imgSource;
  • private $extension;
  • private $sizeSource;
  • private $typeResize;
  • private $ressource;
  • private $forceDimensions = false;
  • private $deleteSource = false;
  • private $alphaMode = false;
  • private $txtImg;
  • private $fontFamily = 'polices/arial.ttf';
  • private $errorResize;
  • //SET
  • public function setMemoryUsed() {
  • $this->memoryUsed = true;
  • }
  • public function setDroits($v) {
  • $this->droits = $v;
  • }
  • public function setnbrResize($v) {
  • $this->nbrResize = $v;
  • }
  • public function setMemoryLimit($v) {
  • $this->memoryLimit = $v;
  • }
  • public function setTxtImg($v) {
  • $this->txtImg = $v;
  • }
  • public function setForceDimensions() {
  • $this->forceDimensions = true;
  • }
  • public function setDeleteSource() {
  • $this->deleteSource = true;
  • }
  • public function setAlphaMode() {
  • $this->alphaMode = true;
  • }
  • //GET
  • private function getMemory() {
  • if($this->extension == ".png" || $this->extension == ".PNG")
  • $this->memory = 0;
  • else {
  • $this->infosDebug = getimagesize($this->imgSource);
  • $m_need = round((($this->infosDebug[0]*$this->infosDebug[1]*$this->infosDebug['bits']*$this->infosDebug['channels']/8+pow(2,16))*1.65)*$this->nbrResize);
  • $this->memory = round($m_need / pow(1024,2),2);
  • }
  • }
  • public function getImgSource() {
  • return $this->imgSource;
  • }
  • public function getImgName() {
  • return $this->imgName;
  • }
  • public function getErrorResize() {
  • return $this->errorResize;
  • }
  • public function getPathImg() {
  • return $this->pathImg;
  • }
  • //CONSTRUCT
  • public function __construct($pathSource, $imgName, $extension, $nbrResize=1) {
  • if(file_exists($pathSource."/".$imgName.$extension)) {
  • $this->pathSource = $pathSource;
  • $this->imgName = $imgName;
  • $this->extension = $extension;
  • $this->imgNameSource = $imgName.$extension;
  • $this->imgSource = $pathSource."/".$this->imgNameSource;
  • $this->nbrResize = $nbrResize;
  • $this->getMemory();
  • if($this->memory >= $this->memoryLimit) {
  • $newSource = new ImageResize($this->pathSource, $this->imgName, $this->extension);
  • $this->ressource = $newSource->resize("homothety", $this->pathSource, "1000", substr($this->imgNameSource,0,-4));
  • $this->sizeSource = getimagesize($newSource->imgSource);
  • imagedestroy($newSource->ressource);
  • }
  • else {
  • if(!$this->imgWorking())
  • $this->errorResize = "<b class=''>ERREUR</b> : L'image de travail n'a pas pu &ecirc;tre cr&eacute;&eacute;e";
  • }
  • }
  • else {
  • $this->errorResize = "<b class=''>ERREUR</b> : L'image source n'existe pas";
  • return false;
  • }
  • }
  • //METHOD
  • private function imgWorking() {
  • $this->sizeSource = getimagesize($this->imgSource);
  • switch($this->sizeSource[2]) {
  • case 1: // gif
  • $this->ressource = @imagecreatefromgif($this->imgSource); break;
  • case 2: // jpeg
  • $this->ressource = @imagecreatefromjpeg($this->imgSource); break;
  • case 3: // png
  • $this->ressource = @imagecreatefrompng($this->imgSource); break;
  • default:
  • $this->errorResize = "<b class=''>ERREUR</b> : L'image source n'est pas reconnue";
  • return false;
  • }
  • return true;
  • }
  • public function resize($typeResize, $path, $dimensions="", $imgName="") {
  • if(is_resource($this->ressource)) {
  • $this->typeResize = $typeResize;
  • $this->path = $path;
  • $this->uniqName($imgName);
  • switch($this->typeResize) {
  • case "homothety":
  • $finalImg = $this->defineHomothety($dimensions); break;
  • case "homothetyHeight":
  • $finalImg = $this->defineHomothety($dimensions, "height"); break;
  • case "crop":
  • $finalImg = $this->defineCrop($dimensions); break;
  • case "wallpaper":
  • $finalImg = $this->defineWallpaper(); break;
  • }
  • if($this->createDir())
  • if($this->createImg($finalImg)) {
  • $this->getMemory();
  • $this->pathImg = $this->path."/".$this->imgName.$this->extension;
  • return $finalImg;
  • }
  • }
  • else {
  • $this->errorResize = "<b class=''>ERREUR</b> : La ressource de l'image n'est pas accessible";
  • return false;
  • }
  • }
  • private function defineHomothety($dimensions, $constraint="") {
  • if(preg_match('`\/`', $dimensions)) {
  • $tabDimensions = explode("/", $dimensions);
  • //paysage
  • if($this->sizeSource[0] > $this->sizeSource[1]) {
  • $width = round($tabDimensions[0]);
  • $height = round($this->sizeSource[1]*($tabDimensions[0]/$this->sizeSource[0]));
  • }
  • //portrait
  • else {
  • $width = round($this->sizeSource[0]*($tabDimensions[1]/$this->sizeSource[1]));
  • $height = round($tabDimensions[1]);
  • }
  • }
  • else {
  • if($constraint == "height") {
  • $height = round($dimensions);
  • $width = round($this->sizeSource[0]*($height/$this->sizeSource[1]));
  • }
  • else {
  • $width = round($dimensions);
  • $height = round($this->sizeSource[1]*($width/$this->sizeSource[0]));
  • }
  • }
  • if(!$this->forceDimensions && ($this->sizeSource[0] < $width && $this->sizeSource[1] < $height)) {
  • $width = round($this->sizeSource[0]);
  • $height = round($this->sizeSource[1]);
  • }
  • $finalImg = imagecreatetruecolor($width, $height);
  • if($this->alphaMode)
  • $this->alpha($finalImg);
  • imagecopyresampled($finalImg, $this->ressource, 0, 0, 0, 0, $width, $height, $this->sizeSource[0], $this->sizeSource[1]);
  • return $finalImg;
  • }
  • private function defineCrop($dimensions) {
  • if(preg_match('`\/`', $dimensions)) {
  • $tabDimensions = explode("/", $dimensions);
  • $width = $tabDimensions[0];
  • $height = $tabDimensions[1];
  • }
  • else {
  • $width = $dimensions;
  • $height = $dimensions;
  • }
  • if(!$this->forceDimensions && ($this->sizeSource[0] < $width || $this->sizeSource[1] < $height)) {
  • $width = $this->sizeSource[0];
  • $height = $this->sizeSource[1];
  • }
  • //RAPPORT
  • $rapportWidth = $this->sizeSource[0]/$width;
  • $rapportHeight = $this->sizeSource[1]/$height;
  • $rapportScale = ($rapportWidth < $rapportHeight)?1/$rapportWidth:1/$rapportHeight;
  • $ajustWidth = round($this->sizeSource[0]*$rapportScale);
  • $ajustHeight = round($this->sizeSource[1]*$rapportScale);
  • //IMG intermediaire
  • $ajustImg = imagecreatetruecolor($ajustWidth, $ajustHeight);
  • if($this->alphaMode)
  • $this->alpha($ajustImg);
  • imagecopyresampled($ajustImg, $this->ressource, 0, 0, 0, 0, $ajustWidth, $ajustHeight, $this->sizeSource[0], $this->sizeSource[1]);
  • //COORDONNEES
  • $coordWidthSource = 0;
  • $coordHeightSource = 0;
  • if($this->sizeSource[0] > $this->sizeSource[1])
  • $coordWidthSource = round(($ajustWidth - $width) / 2);
  • else
  • $coordHeightSource = round(($ajustHeight - $height) / 2);
  • $finalImg = imagecreatetruecolor($width, $height);
  • if($this->alphaMode)
  • $this->alpha($finalImg);
  • imagecopy($finalImg, $ajustImg, 0, 0, $coordWidthSource, $coordHeightSource, $ajustWidth, $ajustHeight);
  • return $finalImg;
  • }
  • private function defineWallpaper() {
  • return $this->ressource;
  • }
  • private function createImg($finalImg) {
  • $this->writeTxtImg($finalImg);
  • if($this->alphaMode)
  • $this->alpha($finalImg);
  • switch($this->sizeSource[2]) {
  • case 1: // gif
  • $op = imagegif($finalImg, $this->path."/".$this->imgName.$this->extension, 100); break;
  • case 2: // jpeg
  • $op = imagejpeg($finalImg, $this->path."/".$this->imgName.$this->extension, 100); break;
  • case 3: // png
  • $op = imagepng($finalImg, $this->path."/".$this->imgName.$this->extension); break;
  • default:
  • $this->errorResize = "<b class=''>ERREUR</b> : L'image ".$this->imgName." n'a pas pu &ecirc;tre redimention&eacute;e";
  • return false; break;
  • }
  • return $op;
  • }
  • private function alpha($img) {
  • imagealphablending($img, false);
  • imagesavealpha($img, true);
  • }
  • private function writeTxtImg($img) {
  • if($this->txtImg != "" && $this->typeResize == "wallpaper") {
  • $shadow = imagecolorallocate($this->ressource, 128, 128, 128);
  • $blanc = imagecolorallocate($this->ressource, 223, 223, 223);
  • $police = 20;
  • putenv('GDFONTPATH='.realpath('.'));
  • $font = $this->fontFamily;
  • imagettftext($img, $police, 0, 25, 40, $shadow, $font, $this->txtImg);
  • imagettftext($img, $police, 0, 26, 41, $blanc, $font, $this->txtImg);
  • }
  • }
  • private function uniqName($imgName) {
  • if($imgName == "")
  • $imgName = uniqid("", true);
  • $this->imgName = $imgName;
  • }
  • private function createDir() {
  • if($this->path != "") {
  • if(preg_match('`\/`', $this->path)) {
  • $path = explode("/", $this->path);
  • $newDir = "";
  • foreach($path as $dir) {
  • if($dir == "..") {
  • $newDir .= "../";
  • continue;
  • }
  • if(!file_exists($newDir.$dir))
  • mkdir($newDir.$dir, $this->droits);
  • $newDir .= $dir."/";
  • }
  • }
  • else if(!file_exists($this->path))
  • mkdir($this->path, $this->droits);
  • return true;
  • }
  • else {
  • $this->errorResize = "<b class=''>ERREUR</b> : Aucune destination n'a &eacute;t&eacute; sp&eacute;cifi&eacute;e";
  • return false;
  • }
  • }
  • public function deleteFile($file) {
  • if(file_exists($file)) {
  • @unlink($file);
  • return true;
  • }
  • else
  • return false;
  • }
  • public function __destruct() {
  • if($this->deleteSource) {
  • if(!$this->deleteFile($this->imgSource))
  • $this->errorResize = "<b class=''>ERREUR</b> : Impossible de supprimer l'image source";
  • }
  • if($this->memoryUsed)
  • echo $this->errorResize = "<br /><b class=''>DEBUG</b> : ".$this->memory." Mo de cache utilis&eacute;e";
  • if(is_resource($this->ressource))
  • imagedestroy($this->ressource);
  • }
  • }
  • ?>
<?php
class ImageResize {

	private $memoryUsed = false;
	private $infosDebug;
	
	private $droits = 0777;
	private $memoryLimit = 32;
	
	private $pathSource;
	private $imgNameSource;
	private $imgSource;
	private $extension;
	private $sizeSource;
	private $typeResize;
	
	private $ressource;
	
	private $forceDimensions = false;
	private $deleteSource = false;
	private $alphaMode = false;
	private $txtImg;
	private $fontFamily = 'polices/arial.ttf';
	
	private $errorResize;
	
	//SET
	public function setMemoryUsed() {
		$this->memoryUsed = true;
	}
	public function setDroits($v) {
		$this->droits = $v;
	}
	public function setnbrResize($v) {
		$this->nbrResize = $v;
	}
	public function setMemoryLimit($v) {
		$this->memoryLimit = $v;
	}
	public function setTxtImg($v) {
		$this->txtImg = $v;
	}
	public function setForceDimensions() {
		$this->forceDimensions = true;
	}
	public function setDeleteSource() {
		$this->deleteSource = true;
	}
	public function setAlphaMode() {
		$this->alphaMode = true;
	}
	
	//GET
	private function getMemory() {
		if($this->extension == ".png" || $this->extension == ".PNG") 
			$this->memory = 0;
		else {
			$this->infosDebug = getimagesize($this->imgSource);
			$m_need = round((($this->infosDebug[0]*$this->infosDebug[1]*$this->infosDebug['bits']*$this->infosDebug['channels']/8+pow(2,16))*1.65)*$this->nbrResize); 
			$this->memory = round($m_need / pow(1024,2),2);
		}
	}
	public function getImgSource() {
		return $this->imgSource;
	}
	public function getImgName() {
		return $this->imgName;
	}
	public function getErrorResize() {
		return $this->errorResize;
	}
	public function getPathImg() {
		return $this->pathImg;
	}
	
	//CONSTRUCT
	public function __construct($pathSource, $imgName, $extension, $nbrResize=1) {
		if(file_exists($pathSource."/".$imgName.$extension)) {
			$this->pathSource = $pathSource;
			$this->imgName = $imgName;
			$this->extension = $extension;
			$this->imgNameSource = $imgName.$extension;
			$this->imgSource = $pathSource."/".$this->imgNameSource;
			$this->nbrResize = $nbrResize;
			
			$this->getMemory();
			if($this->memory >= $this->memoryLimit) {
				$newSource = new ImageResize($this->pathSource, $this->imgName, $this->extension);
				$this->ressource = $newSource->resize("homothety", $this->pathSource, "1000", substr($this->imgNameSource,0,-4));
				$this->sizeSource = getimagesize($newSource->imgSource);
				imagedestroy($newSource->ressource);
			}			
			else {
				if(!$this->imgWorking())
					$this->errorResize = "<b class=''>ERREUR</b> : L'image de travail n'a pas pu &ecirc;tre cr&eacute;&eacute;e";
			}
		}
		else {
			$this->errorResize = "<b class=''>ERREUR</b> : L'image source n'existe pas";
			return false;
		}
	}
	
	//METHOD
	private function imgWorking() {
		$this->sizeSource = getimagesize($this->imgSource);
		switch($this->sizeSource[2]) {
			case 1: // gif
				$this->ressource = @imagecreatefromgif($this->imgSource); break;
			case 2: // jpeg
				$this->ressource = @imagecreatefromjpeg($this->imgSource); break;
			case 3: // png
				$this->ressource = @imagecreatefrompng($this->imgSource); break;
			default:
				$this->errorResize = "<b class=''>ERREUR</b> : L'image source n'est pas reconnue"; 
				return false;
		}
		return true;
	}
	public function resize($typeResize, $path, $dimensions="", $imgName="") {
		if(is_resource($this->ressource)) {
			$this->typeResize = $typeResize;
			$this->path = $path;
			$this->uniqName($imgName);
			
			switch($this->typeResize) {
				case "homothety":
					$finalImg = $this->defineHomothety($dimensions); break;
				case "homothetyHeight":
					$finalImg = $this->defineHomothety($dimensions, "height"); break;
				case "crop":
					$finalImg = $this->defineCrop($dimensions); break;
				case "wallpaper":
					$finalImg = $this->defineWallpaper(); break;
			}
			if($this->createDir())
				if($this->createImg($finalImg)) {
					$this->getMemory();
					$this->pathImg = $this->path."/".$this->imgName.$this->extension;
					return $finalImg;
				}
		}
		else {
			$this->errorResize = "<b class=''>ERREUR</b> : La ressource de l'image n'est pas accessible"; 
			return false;
		}
	}		
	private function defineHomothety($dimensions, $constraint="") {
		if(preg_match('`\/`', $dimensions)) {
			$tabDimensions = explode("/", $dimensions);
			
			//paysage
			if($this->sizeSource[0] > $this->sizeSource[1]) {
				$width = round($tabDimensions[0]);
				$height = round($this->sizeSource[1]*($tabDimensions[0]/$this->sizeSource[0]));
			}
			//portrait
			else {
				$width = round($this->sizeSource[0]*($tabDimensions[1]/$this->sizeSource[1]));
				$height = round($tabDimensions[1]);
			}
		}
		else {
			if($constraint == "height") {
				$height = round($dimensions);
				$width = round($this->sizeSource[0]*($height/$this->sizeSource[1]));
			}
			else {
				$width = round($dimensions);
				$height = round($this->sizeSource[1]*($width/$this->sizeSource[0]));
			}
		}
		if(!$this->forceDimensions && ($this->sizeSource[0] < $width && $this->sizeSource[1] < $height)) {
			$width = round($this->sizeSource[0]);
			$height = round($this->sizeSource[1]);
		}
		
		$finalImg = imagecreatetruecolor($width, $height);
		if($this->alphaMode) 
			$this->alpha($finalImg);

		imagecopyresampled($finalImg, $this->ressource, 0, 0, 0, 0, $width, $height, $this->sizeSource[0], $this->sizeSource[1]);
		return $finalImg;
	}
	private function defineCrop($dimensions) {
		if(preg_match('`\/`', $dimensions)) {
			$tabDimensions = explode("/", $dimensions);
			$width = $tabDimensions[0];
			$height = $tabDimensions[1];
		}
		else {
			$width = $dimensions;
			$height = $dimensions;
		}
		if(!$this->forceDimensions && ($this->sizeSource[0] < $width || $this->sizeSource[1] < $height)) {
			$width = $this->sizeSource[0];
			$height = $this->sizeSource[1];
		}
		//RAPPORT
		$rapportWidth = $this->sizeSource[0]/$width;
		$rapportHeight = $this->sizeSource[1]/$height;
		$rapportScale = ($rapportWidth < $rapportHeight)?1/$rapportWidth:1/$rapportHeight;
		
		$ajustWidth = round($this->sizeSource[0]*$rapportScale);
		$ajustHeight = round($this->sizeSource[1]*$rapportScale);
			
		//IMG intermediaire
		$ajustImg = imagecreatetruecolor($ajustWidth, $ajustHeight);
		if($this->alphaMode) 
			$this->alpha($ajustImg);
			
		imagecopyresampled($ajustImg, $this->ressource, 0, 0, 0, 0, $ajustWidth, $ajustHeight, $this->sizeSource[0], $this->sizeSource[1]);
		
		//COORDONNEES
		$coordWidthSource = 0;
		$coordHeightSource = 0;
		if($this->sizeSource[0] > $this->sizeSource[1])
			$coordWidthSource = round(($ajustWidth - $width) / 2);
		else 
			$coordHeightSource = round(($ajustHeight - $height) / 2);
			
		$finalImg = imagecreatetruecolor($width, $height);
		if($this->alphaMode) 
			$this->alpha($finalImg);
			
		imagecopy($finalImg, $ajustImg, 0, 0, $coordWidthSource, $coordHeightSource, $ajustWidth, $ajustHeight);
		return $finalImg;
	}
	private function defineWallpaper() {
		return $this->ressource;
	}
	private function createImg($finalImg) {
		$this->writeTxtImg($finalImg);
		if($this->alphaMode) 
			$this->alpha($finalImg);
		
		switch($this->sizeSource[2]) {
			case 1: // gif
				$op = imagegif($finalImg, $this->path."/".$this->imgName.$this->extension, 100); break;
			case 2: // jpeg
				$op = imagejpeg($finalImg, $this->path."/".$this->imgName.$this->extension, 100); break;
			case 3: // png
				$op = imagepng($finalImg, $this->path."/".$this->imgName.$this->extension); break;
			default:
				$this->errorResize = "<b class=''>ERREUR</b> : L'image ".$this->imgName." n'a pas pu &ecirc;tre redimention&eacute;e"; 
				return false; break;
		}
		return $op;
	}
	private function alpha($img) {
		imagealphablending($img, false);
		imagesavealpha($img, true);
	}
	private function writeTxtImg($img) {
		if($this->txtImg != "" && $this->typeResize == "wallpaper") {
			$shadow = imagecolorallocate($this->ressource, 128, 128, 128);
			$blanc = imagecolorallocate($this->ressource, 223, 223, 223);
			$police = 20;
			putenv('GDFONTPATH='.realpath('.'));
			
			$font = $this->fontFamily;			
			
			imagettftext($img, $police, 0, 25, 40, $shadow, $font, $this->txtImg);
			imagettftext($img, $police, 0, 26, 41, $blanc, $font, $this->txtImg);
		}
	}
	private function uniqName($imgName) {
		if($imgName == "")
			$imgName = uniqid("", true);
		$this->imgName = $imgName;
	}
	private function createDir() {
		if($this->path != "") {
			if(preg_match('`\/`', $this->path)) {
				$path = explode("/", $this->path);
				$newDir = "";
				foreach($path as $dir) {
					if($dir == "..") {
						$newDir .= "../";
						continue;
					}
					if(!file_exists($newDir.$dir))
						mkdir($newDir.$dir, $this->droits); 
						
					$newDir .= $dir."/";
				}
			}
			else if(!file_exists($this->path))
				mkdir($this->path, $this->droits);
				
			return true;
		}
		else {
			$this->errorResize = "<b class=''>ERREUR</b> : Aucune destination n'a &eacute;t&eacute; sp&eacute;cifi&eacute;e";
			return false;
		}
    }
	public function deleteFile($file) {
		if(file_exists($file)) {
			@unlink($file);
			return true;
		}
		else
			return false;
	}
	public function __destruct() {			
		if($this->deleteSource) {
			if(!$this->deleteFile($this->imgSource))
				$this->errorResize = "<b class=''>ERREUR</b> : Impossible de supprimer l'image source";
		}
		if($this->memoryUsed)
			echo $this->errorResize = "<br /><b class=''>DEBUG</b> : ".$this->memory." Mo de cache utilis&eacute;e";
		
		if(is_resource($this->ressource))
			imagedestroy($this->ressource);	
	}
}
?>


 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

18 mai 2010 14:40:59 :
Correction d'une faute d'aurteaugraffe dans le titre.
18 mai 2010 15:06:39 :
N.B: Vous pouvez aussi écrire sur l'image, il suffit de déclarer la méthode setTxtImg(); le chemin vers la police est déclarée en haut de la classe.
18 mai 2010 16:24:22 :
Modification de l'instanciation, j'ai préféré séparer l'extension de nom de l'image.
20 mai 2010 14:56:29 :
Ouups^^
26 mai 2010 18:10:15 :
Nouvelle option "homothetyHeight" pour une image homothethique contrainte sur la hauteur
26 mai 2010 18:46:13 :
Meme que y a 5 minutes
27 mai 2010 01:05:01 :
Ajout de la methode setAlphaMode() pour garder la transparence des images png
27 mai 2010 10:33:52 :
Petites corrections diverses
27 mai 2010 15:51:20 :
Modification du type mime png pour IE sur la classe upload
10 juin 2010 10:50:39 :
Ajout de la methode getPathImg(); Elle retourne l'image redimentionnée.

 Sources du même auteur

Source avec Zip Source avec une capture GÉNÉRATION DE FORMULAIRES HTML PERSONNALISÉS.
Source avec Zip CLASSE D'UPLOAD DE FICHIER PHP

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

Source avec Zip CODE POUR HÉBERGEUR D'IMAGE par bonhommecrea
Source avec Zip CLASSE D'UPLOAD DE FICHIER PHP par beejeridou
UPLOAD + AFFICHAGE ET SUPPRESSION DU CONTENU D'UN DOSSIER (I... par mondherclubiste
Source avec Zip UPLOAD IMAGES POUR FORUMS ET SITES MUTUALISÉS (AJAX + PHP + ... par hartley
Source avec Zip CLASS PHP 5 POUR CHARGEMENT ET REDIMENSIONNEMENT D'IMAGES (S... par f bnkcm

Commentaires et avis

Commentaire de ro2kpdp le 19/05/2010 09:20:57

Bonjour,
Felicitation puissante fonction mais je n'arrive pas a ecrire sur l'image.

encore Merci

Commentaire de beejeridou le 19/05/2010 10:30:08

Alors, ui, je n'ai pas précisé, mais l'écriture sur l'image ne se fait que sur un redimensionnement de type "wallpaper".

J'ai fais comme ca car je n'ai pas fait de méthode pour calculer la taille de la police dynamiquement en fonction de la taille de la nouvelle image... Certainement une modification à apporter dès que j'ai un brin de temps.

Commentaire de kharmouza le 23/05/2010 15:54:34

Félicitation tu est un génie ;)

Commentaire de beejeridou le 23/05/2010 17:26:29

Oh! je dois dire que je ne m'attendais pas à autant^^ en tous cas, ravi que ca te plaises!
Bonne continuation!

Commentaire de KasPe le 24/05/2010 11:38:50

J'ai pas tout regardé, juste testé vite fait et je dis déjà merci.
Un petit apport sur ta classe upLoad, j'ai rajouté les extensions en majuscule pour le typeMime. Mon appareil photo génère des fichiers blabla.JPG qui étaient considérés comme corrompus.

Commentaire de beejeridou le 24/05/2010 14:32:23

Je suppose que tu as rajouté case "JPG": case "JPEG" à la ligne 165?

Commentaire de pietje24 le 24/05/2010 15:09:14

Bonjour,
ces classes sont super.
Avant de bricoler, peux-tu me donner la marche à suivre pour forçer les dimensions ?
Je te remercie

Commentaire de beejeridou le 24/05/2010 15:20:53

Bonjour,
Il te suffit d'initialiser la methode setForceDimensions().

C'est la ligne que j'ai commenté dans l'exemple que j'ai fourni. Petit rappel, si l'image est plus petite que le redimensionnement demandé, la qualité sera moins bonne vu que les pixels seront agrandis.

Commentaire de pietje24 le 24/05/2010 16:27:58

J'avais bien vu, mais comment donner les dimensions voulues ?

Commentaire de beejeridou le 24/05/2010 16:40:12

Ben les dimensions sont données quand tu définis tes méthodes resize()...

Par exemple, tu veux absolument une image rectangle (pour une bannière pub par ex), de 160px x 1300px, tu fais:

$img = new ImageResize($upload->getPath(), $upload->getName(), $upload->getExtension(), 1);

$img->setForceDimensions();
$img->resize("crop","ici/etla", "160/1300");

En espérant avoir pu t'aider.

Commentaire de marsbidon le 26/05/2010 12:16:26

Bonjour,

Le redimensionnement ne fonctionne pas avec les png?
A chaque essai de redimensionnement de png j'ai :
"ERREUR : Le fichier semble être corrompu"

Y-a-t-il une astuce?

merci!

Commentaire de beejeridou le 26/05/2010 15:25:46

Cette erreur vient de la classe upload. Précisément de la méthode verifMimeType(), où dedans je n'ai pas précisé le type-mime pour le png.

Tu peux rajouter autant d'exceptions que tu le souhaites dans cette methode.

Voici une liste de type mime:
http://fr.selfhtml.org/divers/typesmime.htm

Bye!

Commentaire de marsbidon le 26/05/2010 15:53:20

Le type mime png n'existe pas sur selfhtml... je l'ai trouvé ici : http://www.sfsu.edu/training/mimetype.htm

J'ai essayé, j'ai ajouté :
"
case "png": case "PNG":
if($mimeType == "image/png" || $mimeType == "image/ppng") return true; break;
"

Cela ne génère plus d'erreur, l'image est bien créé avec le bon nom mais elle est vide.

Commentaire de marsbidon le 26/05/2010 17:19:31

petite question subsidiaire en plus de mon problème de PNG :

comment ne redimensionner que la hauteur ?
Je voudrai que mes images soient redimensionnées avec une hauteur de 100px mais en conservant le ratio largeur/hauteur...

Commentaire de beejeridou le 26/05/2010 18:45:28

Hello, et merci à toi Marsbidon!

Voilà, j'ai donc rajouté le nouveau paramètre "homothetyHeight", pour fabriquer une image homothetique contrainte sur la hauteur.

Pour le png, j'ai également fait une pt'te modif qui fonctionne chez moi, dis moi si c'est pareil pour toi

Commentaire de marsbidon le 26/05/2010 20:22:20 10/10

Bravo!
Tout fonctionne nikel : PNG et homothétie sur la hauteur ...
Content d'avoir fait avancer cette classe d'un petit pas!

Belle classe

Commentaire de marsbidon le 26/05/2010 23:38:16

Re ...
Tout compte fait, après diverses images uploadées et redimensionnées, je me suis trouvé confronté à un nouveau problème : la transparence des PNG.
Après redimensionnement, tout ce qui est transparent devient noir ... réglage à faire ?

Commentaire de beejeridou le 27/05/2010 00:58:53

Yesss! ben au final tu auras plus testé ma classe que moi! ET C'EST GENIAL!!

J'ai trouvé la solution:

Il suffit maintenant de déclarer la methode setAlphaMode() et.... BINGO!!!

(je met la modif dans les 5 prochaines minutes...)

Commentaire de marsbidon le 27/05/2010 14:39:52

Là c'est Tout bon pour moi, je n'ai pas remarqué de nouvelle amélioration possible ... pour l'instant.
J'hésiterai pas à revenir poster s'il y a besoin.

Merci pour ces MAJ rapides et efficaces

@plus

Commentaire de Elran le 07/06/2010 01:45:55

super cette class!
par contre, le nom du fichier redimensionné étant le même pour chaque type de redimensionnement, si l'on upload/resize plusieurs fichiers l'un après l'autre ils s'écrasent...
nom_du_dichier_d_origine + type_de_resize aurait était nickel comme nom de fichier... ;)

Commentaire de Elran le 07/06/2010 02:03:45

oups, autant pour moi, il suffisait de virer le nom dans l'appel de la fonction...

Commentaire de beejeridou le 07/06/2010 10:23:31

J'ai oublié de le préciser^^ désolé!

Commentaire de Elran le 07/06/2010 12:26:13

les noms des variables étaient suffisamment explicite... ;)

Commentaire de Elran le 09/06/2010 16:36:04

bonjour,
je souhaiterais, après l'upload, pouvoir récupérer les chemin d'accès(avec les noms des fichiers) vers les images uploadées, où faut il aller regarder et que faut il récupérer svp?
j'en aurais besoin pour les affectés à 2 champs d'un formulaire d'une page que j'appellerais à la fin de l'upload...


Commentaire de beejeridou le 09/06/2010 17:45:18

Bien vu, je te fais ça dès que j'ai un brin de temps (surement demain).

Commentaire de Elran le 09/06/2010 20:06:00

en fait j'ai réussi à faire un echo sur le chemin d'un des fichiers, celui qui est uploadé sans resize:
$chemin_photo = $upload->getPath()."/".$upload->getName().$upload->getExtension();
echo $chemin_photo;

que j'ai mis tout à la fin du fichier class.imageResize.php quand le fichier uploadfile est appelé.

par contre pour celui qui est redimensionné... j'y arrive pas.

Commentaire de beejeridou le 10/06/2010 10:53:08

J'ai ajouté la méthode getPathImg().
Je ne l'ai pas testée^^ désolé. Dis moi si ca marche. Tu dois normalement l'appeler après chaque méthodes resize();

L'idéal serait de retourner un tableau contenant toutes les images redimentionnées... c la prochaine modif.

Commentaire de Elran le 10/06/2010 12:59:35

ok, je vais vérifier ça dès demain, en attendant je poste ici une petite astuce:
pour faire en sorte que les vignettes aient le même nom que l'image source:

dans le fichier class.imageResize.php, fonction resize:
j'ai juste commenté la ligne:

//$this->uniqName($imgName);

l'auteur de cette class pourra me dire si c'est pas un peu barbare ce que j'ai fait... ;)

Commentaire de beejeridou le 10/06/2010 14:41:24

perso je me serais servi du parametre $imgName pour renommer l'image. Dans la classe UploadFile, tu peux retourner juste le nom du fichier, puis le passer dans ImageResize.
Ta manière de procéder peux fonctionner si tu passes par la classe UploadFile avant, car elle enlève les caractères spéciaux qui peuvent générer des bugs.

Cordialement!

Commentaire de beejeridou le 31/08/2010 14:32:13

Je ne sais pas comment mais on m'informe que l'exemple d'instanciation de la classe a disparu du code source... je le met ci-dessous (basique):

<?php
require_once("class.UploadFile.php");
require_once("class.ImageResize.php");

//FORMULAIRE UPLOAD IMAGE
$formImg = '
<form method="post" enctype="multipart/form-data">
<input type="file" name="nom_du_input_file" />
<input type="submit" value="upload" name="submit" />
</form>
';
echo $formImg;

if(isset($_FILES['nom_du_input_file'])) {
$upload = new UploadFile('nom_du_input_file');

$upload->setType("jpg/jpeg/gif/png"); // pas de slash a la fin
$upload->setPath("images/encore/un/repertoire/etc"); // pas de slash a la fin

$up = $upload->upload();

$message = "";

if($up) {
$img = new ImageResize($upload->getPath(), $upload->getName(), $upload->getExtension(), 6);
$img->setAlphaMode();
//$img->setForceDimensions();

$img->resize("homothety", $upload->getPath(), "100");
$img->resize("homothetyHeight", $upload->getPath(), "100");
$img->resize("crop", $upload->getPath(), "10", "nom_image_perso");
$img->resize("crop", $upload->getPath(), "100/60", "crop_paysage");
$img->resize("crop", $upload->getPath(), "60/100", "crop_portrait");
$img->resize("wallpaper", $upload->getPath(), "", "wallpaper");

$img->setDeleteSource(); //ne fonctionne pas tres bien, je ne comprend pas trop pourquoi...

$message = $img->getErrorResize();
}

$message = $upload->getErrorUpload();

echo $message;
}
?>

Plus plus!
//Beejeridou

Commentaire de Nobitos le 23/09/2010 18:10:05

Bonjour à tous,

bravo à Beejeridou pour ce code, que je trouve vraiment bien conçu.
Cela me permet surtout d'approcher la POO.

Je débute en PHP, (POO ou pas !) et j'essaie de comprendre...

Par exemple, je ne comprends pas du tout comment est alimentée la variable "name", qui sert à UPLOADER le fichier ???
D'autre part, la variable "prefixeName" est toujours vide ??
Merci donc de m'aider à comprendre comment sont alimentées ces deux variables.

(Je précise que je n'appelle plus la fonction qui créé la Directory, car celle-ci existe déjà et je veux la conserver. D'ailleurs, si je laisse le code tel que avec l'appel à la fonction...ça plante !).

En fait, je veux donner au fichier le nom d'origine, qui se trouve donc dans :

$_FILES['nom_du_input_file']['name']

Si tu pouvais éclairer ma lanterne, cela m'aiderait considérablement !!

En espérant avoir été suffisamment clair,
cordialement,
nobitos.

Commentaire de beejeridou le 24/09/2010 10:06:49

Hello,
Il faut d'abord savoir qu'une classe fonctionne comme un ensemble. Je dis ça car je te conseille de laisser la methode createDir(), car elle fonctionne de manière native si l'endroit de destination n'existe pas.
Ensuite, tu as des "SETTERS" et des "GETTERS": ce sont des methodes pour alimenter la classe, àprès son implémentation. C'est d'ailleurs pour ça qu'elles sont de type "public" alors que les autres sont de type "private". Ces valeurs ont pour le plus souvent un comportement "par défaut", comme $this->name ou $this->prefixeName. En clair, si tu n'appelles pas $upload->setName, ton fichier prendra un nom unique. Idem pour $upload->setPrefixeName.

Si tu veut donner ton nom du fichier d'origine: par exemple:

$upload = new UploadFile('nom_du_input_file');

$upload->setType("jpg/jpeg/gif/png"); // pas de slash a la fin
$upload->setPath("images/encore/un/repertoire/etc"); // pas de slash a la fin

$upload->setPrefixeName("prefixe-");
$upload->setName($_FILES['nom_du_input_file']['name']);

$up = $upload->upload();

En plus, le nom sera automatiquement mis sans les accents et caractères spéciaux, ce qui peut poser beaucoup de problèmes sur des serveurs linux par exemple.

Il est vrai que dans mon exemple, je n'ai pas changé le nom du fichier source car il est changé dans la classe imgResize par la suite. Mais ce n'est que dans le cas d'un upload d'images.

En espérant avoir pu t'aider un brin.

Cordialement
//Beejeridou */

Commentaire de Nobitos le 24/09/2010 10:37:40

Bonjour,

merci pour ta réponse rapide.
En effet, tu m'aides, et plus qu'un brin !
J'ai un peu farfouillé dans les différents tuto sur la POO que l'on peut trouver sur le Net, et j'avais fini par comprendre qu'il fallait appeler les méthodes dont j'avais besoin afin de donner le nom que je voulais pour mon fichier (méthodes 'magiques' _SET et _GET).
Donc, PREFIXENAME était vide...parce que je n'appelais pas la méthode !
Le nom lui-meme était finalement constitué uniquement du UNIQNAME.
Pour la DIRECTORY, je réessaierai ce soir (je suis à mon boulot) : je pense que ça plantait parce que je ne devait pas indiquer le bon chemin...

Quoi qu'il en soit, je suis très content de ce code qui me fait beaucoup mieux comprendre la POO (30 ans de COBOL, ça n'aide pas !) et je vais tenter de développer mon site de cette façon.

Une dernière chose : le temps d'éxécution est terriblement long pour une seule image (dans les 20 secondes environ).
La photo pèse environ 2,5MB et je teste en local (WAMP): est-ce déjà beaucoup trop gros pour un UPLOAD ?

Encore merci,
cordialement,
Nobitos.  

Commentaire de beejeridou le 24/09/2010 11:06:15

Ah oué... 20 secondes en local (même en ligne) n'est pas normal!
Ton image est bien redimensionnée à la fin comme tu le voulais? combien fais tu de redimensionnements? as tu essayé d'uploader juste le fichier (juste utiliser la classe upload, sans la classe resize)? as tu essayé d'uploader une image un peu moins lourde (<2mo)?

Cordialement,
//Beejeridou */

Commentaire de Nobitos le 24/09/2010 11:35:46

Oui, l'image est parfaitement bien redimensionnée, et surtout, (c'est ça qui m'intéresse) elle ne pèse plus que...350KO environ au lieu de 2,5MB ! ça, c'est super.
Je ne fais qu'un seul redimensionnement : Homothéty.
Les autres type de redim. sont mis en commentaires.

J'avais fais le test de n'appeler que la classe UPLOAD, mais je ne me souviens plus du résultat en termes de délais d'éxécution (à ce moment, ce n'est pas ce qui m'intéressait).
J'aurai plus d'information ce soir quand je serai chez moi.

A+ et bonne journée,
cordialement,
Nobitos.

Commentaire de kharmouza le 07/10/2010 06:08:23

salut est ce qu'il y a une possibilité d'avoir envoyer plusieurs fichier a la foi le cas de l'upload multiple tu peut ajouter une classe pour l'upload multiple SVP  

Commentaire de beejeridou le 07/10/2010 12:45:14

Salut,
Il te suffit de déclarer plusieurs objets. Après, j'imagine que tu gères l'upload multiple en Flash? php/HTML ne le gère pas à lui tout seul.

Commentaire de kharmouza le 07/10/2010 15:12:02

si j'ai trouver sur d'autre source d'upload crée en POO l'upload multiple sans passé par le flash

Commentaire de kharmouza le 07/10/2010 15:51:15 10/10

j'ai besoin d'une classe qui fait L'upload multiple plus le redimensionnement des images en 3 types  l'homothétie, le crop et le wallpaper. si vous vous avez une source aider moi SVP

Commentaire de beejeridou le 11/10/2010 11:22:32

La source est sur cette page. A vous d'adapter l'exemple selon vos besoins.

Cordeialement,
//Beejeridou */

Commentaire de kharmouza le 13/10/2010 21:47:50

hhhhhh ok men :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Upload dossier d'images et traitement [ par Silou ] Bonjour,Je possède un site de vente de photo online, et le problème pour moi est que je doit parfois uploader sur le serveur des 10 ène d'images, vous multiple upload a mysql avec php [ par Xavihb ] Salut,J'aurais besoin de savoir comment faire un multiple upload d'images &#224; une base de donn&#233;es mySQL &#224; l'aide de PHP. Les champs des i upload d'images [ par fedebul ] bonjour, j'ai trouvé un script qui permet un upload d'images sur le serveur, mais j'aimerais que ces images soient rangées dans une feuille XML, pour upload + affichage images [ par ultra_nezz ] Bonjour,voila je cherche mais ne trouve pas ,une petite source (si elle est petite )qui pourrait m'aider a finir mon petit site persoj'aimerais avoir upload d'images et virus???? [ par mickadevelop ] Bonjour à tous,Je vois beaucoup de codes concernant l'upload d'images sur un serveur mais par contre je ne trouve pas d'info sur les potentiels virus Upload et redimensionnement [ par piep14 ] Bonsoir, j'ai essayé d'utiliser ce code d'un membre :http://www.phpcs.com/codes/CLASSE-POUR-GERER-REDIMENSIONS-IMAGES-AVEC-GD_29407.aspxCa marche très Variable dans une URL [ par L0rD59 ] Bonjours j'ai un petit souci avec une variable et une URLje vous explique le contexte J'ai une fichier PHP qui permet d'upload des image (grace au bou Upload , nom d'image, BDD mysql [ par Grumo ] Bonjour &#224; tous,voil&#224; je me suis constitu&#233; un petit formulaire me permettant&nbsp; d'uploader des images dans une bdd msql (enfin leur n Pb d'upload d'images [ par devillersdavid ] Bonjour &#224; tous,J'arrive &#224; uploader correctement certaines images sur mon site mais d'autres sont mal upload&#233;es.J'utilise le script du s wamp+upload des images [ par imaneflash ] comment faire l upload des images je veux les stocker sur mon disque dur c posssible!?


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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,624 sec (3)

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