Nell’articolo http://lingegnereinformatico.blogspot.it/2014/05/ridimensionamento-immagini-in-php.html
abbiamo affrontato l’argomento del ridimensionamento delle immagini in PHP,
fornendo un codice finale per ottenere un ridimensionamento quadrato
dell’immagine prendendo il centro dell’immagine sorgente come punto di
riferimento. Un limite del codice fornito nell’articolo è sicuramente il
mancato supporto alla trasparenza, tipica caratteristica delle immagini con estensioni
.PNG
Lo scopo di questa guida è quello di aggiornare il codice
sorgente per poter supportare questo tipo di caratteristica.
La trasparenza
Nella rappresentazione delle immagini digitali vengono
utilizzati in genere diversi canali sovrapposti. Uno di questi si chiama canale
alpha e non è obbligatorio. Esso descrive la trasparenza di ogni singolo pixel
dell’immagine attraverso un valore numerico. I formati immagine più famosi che
supportano questo canale sono i PNG e TIFF. Il formato .JPEG anche se molto
diffuso non supporta questo tipo di caratteristica.
Trasparenza in PHP
Premessa: Il punto di partenza è sempre rappresentato dall’immagine
creata attraverso la funzione imagecreatetruecolor().
La prima funzione da utilizzare è imagealphablending() che
permette di disegnare in due modalità differenti. Nel nostro caso dovremo disattivare
il blending (letteralmente “miscelazione”), in questo modo il colore viene
copiato direttamente insieme a valore del canale alpha senza operazioni
intermedie. Di default il valore è TRUE, noi dovremo disattivarlo, quindi
imporre il valore a FALSE.
Proseguendo, un’altra funzione indispensabile è l’imagesavealpha()
che consentirà di settare un flag (a true per i nostri scopi) attraverso il
quale lo script salverà le informazioni relative al canale alpha quando si
salva una immagine PNG. Ovviamente, per utilizzare questa funzione è necessario
disattivare il blending. Di default il valore è FALSE.
A questo punto bisogna allocare un colore con la
trasparenza, la funzione da utilizzare è
int imagecolorallocatealpha ( resource
$image
, int $red
, int $green
, int $blue
, int$alpha
)
e sfruttare questa funzione per disegnare un rettangolo delle
stesse dimensioni utilizzate per il ridimensionamento delle immagini, al quale
passeremo in valore del colore appena creato
bool imagefilledrectangle ( resource
$image
, int $x1
, int $y1
,int $x2
, int $y2
, int $color
)
queste operazioni andranno a creare una
base per l’immagine da ridimensionare che sarà “montata” sopra questo livello. In
questo modo, nel caso di caricamento di png, la trasparenza viene conservata.
A questo punto, sarà facile ritoccare la funzione
Ridimensiona nella classe UImage fornita nel tutorial linkato all’inizio di
questa guida, per supportare le trasparenze di una immagine PNG. Il codice aggiuntivo è indicato in verde.
public function Ridimensiona($src,$dim)
{
$dst_w=$dim;
$dst_h=$dim;
$size = getimagesize($src);
if( $size[2] == 2 ){$src_image = @imagecreatefromjpeg($src);}
elseif( $size[2] == 1 ){$src_image = @imagecreatefromgif($src);}
elseif( $size[2] == 3 ){$src_image = @imagecreatefrompng($src);}
$dst_x=0;
$dst_y=0;
if( $size[0]>$dim or $size[1]>$dim )
{
$centerX = $size[0]/2;
$centerY = $size[1]/2;
if( $size[0] > $size[1] ){
$src_y = 0;
$src_x = $centerX-$centerY;
$src_h = $size[1];
$src_w = $size[1];
}
else{
$src_x = 0;
$src_y = $centerY-$centerX;
$src_w = $size[0];
$src_h = $size[0];
}
$dst_image = imagecreatetruecolor($dim, $dim);
if( $size[2] == 3 )
{
imagealphablending($dst_image, false);
imagesavealpha($dst_image,true);
$transparent = imagecolorallocatealpha($dst_image, 255, 255, 255, 127);
imagefilledrectangle($dst_image, 0, 0, $dst_w, $dst_h, $transparent);
}
imagecopyresampled ( $dst_image , $src_image , $dst_x , $dst_y , $src_x , $src_y , $dst_w , $dst_h , $src_w , $src_h );
}
else{
$dst_image = $src_image;
}
return $dst_image;
}
0 commenti:
Posta un commento