PHP – Ritagliare immagini su misura con SmartImage

La settimana scorsa ho passato in rassegna le basi per l’uso di SmartImage, una classe che permette di ritagliare le immagini al volo subito dopo un upload. In quel caso abbiamo visto come ridimensionare le immagini secondo le proporzioni (larghezza e altezza) che gli impostiamo noi in precedenza.

Facciamo un passo avanti.
In questo articolo vedremo come fare per mantenere le proporzioni in base alle dimensioni dell’immagine originale. In altre parole, dati due parametri (altezza e larghezza), faremo in modo di ridimensionare le immagini in modo che stia “all’interno” di questi valori.
Sulle nuove dimensioni ottenute applicheremo quindi la classe SmartImage che abbiamo visto nel precedente articolo. Il concetto non cambia, soltanto lo renderemo dinamico.

Anche in qui trovate il codice liberamente scaricabile, da personalizzare in base alle vostre esigenze.

Ridimensionare le immagini entro i parametri scelti

La funzione dimensioni() ha lo scopo di ridimensionare l’immagine, in modo da farla stare entro le dimensioni che stabiliamo come parametri.
I commenti dovrebbero risolvere gran parte dei dubbi, ma per evitare incertezze vediamo i vari passaggi effettuati:
– recuperiamo le informazioni dell’immagine passata nella funzione (ci interessano solo larghezza e altezza)
– prendiamo l’altezza: se l’altezza dell’immagine è maggiore di quella passata come parametro ($h), prendiamo quest’ultimo come valore di altezza
– ridimensioniamo la larghezza in base all’altezza ricavata
– facciamo lo stesso procedimento per la larghezza


A questo punto abbiamo un’altezza e una larghezza che sono uguali o minori dei parametri passati nella funzione.
Per il successivo passaggio (cioè per l’uso in SmartImage) renderemo le due dimensioni identiche, creeremo cioè un “quadrato virtuale” che ha come lato il valore della dimensione più lunga. Se, per esempio, il più lungo era l’altezza, faremo diventare la lunghezza uguale a quest’ultima.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//Mette in un array le dimensioni di un'immagine
// $immagine=indirizzo dell'immagine
// $w e $h sono rispettivamente larghezza e altezza in cui l'immagine deve essere ridimensionata
function dimensioni($immagine, $w, $h){

	//recupera informazioni sull'immagine
	list($width, $height, $type, $attr)=getimagesize($immagine);

	//altezza: se l'immagine ha un'altezza maggiore del valore passato, prendiamo quest'ultimo come altezza
	if($height>$h)
		$altezza=$h;
	else
		$altezza=$height;

	//ridimensiona la larghezza in base all'altezza vista sopra
	$larghezza=$altezza*$width/$height;	

	//rifacciamo il procedimento per la larghezza
	if($larghezza>$w){
		$larghezza=$w;
		$altezza=$larghezza*$height/$width;		
	}

	//crea in pratica un "quadrato" virtuale (altezza=larghezza), usando come lato la dimensione più lunga
	if($altezza>$larghezza)
		$larghezza=$altezza;
	else
		$altezza=$larghezza;

	$array=array("w"=>$larghezza, "h"=>$altezza);

	return $array;

}

SmartImage – Ritaglio vero e proprio dell’immagine

L’uso della classe SmartImage è molto simile a quella dell’articolo precedente, quindi per le informazioni di base rimando alle vecchie spiegazioni.
Il codice è il seguente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if(isset($_FILES['foto']['name']) and $_FILES['foto']['name']!=""){

	include("SmartImage089/SmartImage.class.php"); //importo la classe di smartimage
	$upload_dir="img"; //cartella dove salvare le immagini

	//tolgo dal nome file i caratteri non consentiti
	$arr=array();
	$arr[]="'";
	$arr[]="\\";
	$file_name=.str_replace($arr, "", $_FILES['foto']['name']);
	$file_name=str_replace(".jpg", "", $file_name);

	//dimensioni dell'immagine
	list($width, $height, $type, $attr)=getimagesize($_FILES['foto']['tmp_name']);

	$img=new SmartImage($_FILES["foto"]["tmp_name"]);

	$array=dimensioni($_FILES['foto']['tmp_name'], 1024, 768);

	//il terzo parametro indica se ritagliare l'immagine in caso sia più grande delle dimensioni passate
	//il quarto parametro indica se creare dei bordi bianchi nel caso in cui l'immagine sia più piccola
	$img->resize($array['w'], $array['h'], false, true);
	$img->saveImage($upload_dir."/".$file_name."_nuova.jpg", 85);	

}

Le due righe che ci cambiano rispetto al solito sono il richiamo alla funzione dimensioni(), il cui risultato viene messo in un array, e il resize(), in cui passiamo i valori dell’array:

1
2
$array=dimensioni($_FILES['foto']['tmp_name'], 1024, 768);
$img->resize($array['w'], $array['h'], false, true);

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *