Ridimensionare immagini con PHP facilmente

Girando come al solito nel web mi sono imbattuto in una classe interessante e molto semplice per ridimensionare le immagini al volo.
Unico limite: è richiesta la libreria GD.

La classe in questione permette di settare i parametri basilari per poter creare una versione ridimensionata di un’immagine salvata in un server.

Ecco la classe (autore sconosciuto al momento):

class resize{
	var $urlimage = "";
	var $maxX = 100;
	var $maxY = 100;
	var $fisso = 0;
	var $latofisso = "XY";
	var $folder = "public/";
	var $newName = "";

	function controlladati(){
		$this->errore = array();
		$this->Estensione = "";
		$this->originalX = 0;
		$this->originalY = 0;
		$this->originalName = "";
		$this->newX = 0;
		$this->newY = 0;

		if($this->urlimage==""){
			array_push($this->errore,"Scegliere un file da ridimensionare");
		}elseif(!file_exists($this->urlimage) || !is_file($this->urlimage)){
			array_push($this->errore,"Il file selezionato non esiste");
		}
		if(!is_numeric($this->maxX) || !is_numeric($this->maxY) || $this->maxX<0 || $this->maxY<0){
			array_push($this->errore,"L'altezza e la larghezza dell'immagine devono essere numerici");
		}
		if(!file_exists($this->folder) || !chmod($this->folder,0777)){
			array_push($this->errore,"La cartella di destinazione non esiste o non è scrivibile");
		}
		if($this->fisso!=0 && $this->fisso!=1){
			array_push($this->errore,"La variabile di dimensione fissa deve essere 0 o 1");
		}
		if($this->latofisso!="XY" && $this->latofisso!="X" && $this->latofisso!="Y"){
			array_push($this->errore,"La variabile di lato fisso devono essere X o Y o XY");
		}
		if(count($this->errore)>0){
			return false;
		}else{
			return true;
		}
	}

	function go(){
		if($this->controlladati()){
			$filename = basename($this->urlimage);
			$this->originalName = $filename;
			if($this->newName==""){$this->newName=$filename;}
			$this->Estensione = strtolower(substr($filename, strrpos($filename, "."), strlen($filename)-strrpos($filename, ".")));
			if($this->Estensione==".jpeg" || $this->Estensione==".jpg"){
				$handle_immagine = imagecreatefromjpeg($this->urlimage);
			}elseif($this->Estensione==".gif"){
				$handle_immagine = imagecreatefromgif($this->urlimage);
			}elseif($this->Estensione==".png"){
				$handle_immagine = imagecreatefrompng($this->urlimage);
			}else{
				array_push($this->errore,"Formato immagine non valido");
				return null;
			}
			$handle_immagine_adattata=$this->adatta($handle_immagine);
			imagejpeg($handle_immagine_adattata, $this->folder.$this->newName, 80);
			chmod($this->folder.$this->newName,0777);
			unset($handle_immagine);
			unset($handle_immagine_adattata);
		}
	}

	function adatta($handle_immagine){
		$this->originalX=imagesx($handle_immagine);
		$this->originalY=imagesy($handle_immagine);
		if($this->fisso==1){
			$this->newX=$this->maxX;
			$this->newY=$this->maxY;
		}else{
			if($this->latofisso=="XY"){
				if ($this->originalX/$this->originalY>$this->maxX/$this->maxY) {
					$this->newX=$this->maxX;
					$this->newY=($this->originalY/$this->originalX)*$this->maxX;
				} else {
					$this->newX=($this->originalX/$this->originalY)*$this->maxY;
					$this->newY=$this->maxY;
				}
			}elseif($this->latofisso=="X"){
				$this->newX=$this->maxX;
				$this->newY=($this->originalY/$this->originalX)*$this->maxX;
			}elseif($this->latofisso=="Y"){
				$this->newX=($this->originalX/$this->originalY)*$this->maxY;
				$this->newY=$this->maxY;
			}else{
				if ($this->originalX/$this->originalY>$this->maxX/$this->maxY) {
					$this->newX=$this->maxX;
					$this->newY=($this->originalY/$this->originalX)*$this->maxX;
				} else {
					$this->newX=($this->originalX/$this->originalY)*$this->maxY;
					$this->newY=$this->maxY;
				}
			}
		}
		$tmp_immagine = imagecreatetruecolor($this->newX, $this->newY);
		$handle_immagine_adattata = imagecopyresampled($tmp_immagine, $handle_immagine, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
		return $tmp_immagine;

	}

}

Andrà solamente inserita in testa alla pagina interessata (o in un file esterno da includere, per maggior pulizia).

E qui arriva la parte in cui mettere mano: poche righe per poche impostazioni con un grande risultato. Complicato? Tutt’altro! (aggiungo commenti per maggiore chiarezza)

<?
$resize = new resize; //inizializziamo la classe
$resize->urlimage = "folder/immagine.jpg"; //indirizzo immagine campione
$resize->latofisso = "X"; //scegliere quale lato rimane fisso come dimensioni: X larghezza, Y altezza
$resize->maxX = 250; //larghezza in caso che latofisso sia X
$resize->maxY = 150; //altezza in caso che latofisso sia Y
$resize->folder = "public/thumb/"; //cartella di destinazione: deve avere i permessi di scrittura
$resize->newName = "nuovonome.jpg"; //nome della nuova immagine
$resize->go(); //comando che fa partire la creazione dell'immagine
?>

Se volete avere anche un riscontro per quanto riguarda gli errori aggiungete quanto segue alla fine del codice sopra:

if(count($resize->errore)==0){
/* Ho commentato il codice seguente, lasciato come esempio
	echo "Nome file originale: ".$resize->originalName."<br>";
	echo "Altezza file originale: ".$resize->originalY."<br>";
	echo "Larghezza file originale: ".$resize->originalX."<br>";
	echo "Nuova Altezza: ".$resize->newY."<br>";
	echo "Nuova Larghezza: ".$resize->newX."<br>";
*/
}else{
	echo implode("<br />", $resize->errore); //in caso di errore viene stampato a video ogni errore in singola riga
}

Provato su un server Altervista, mio malgrado, ma con sorpresa ha funzionato senza problemi di sorta!

Annunci

, , , , , , , , , , , , ,

  1. Lascia un commento

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: