Nella grafica al PC, maschera è la selezione di parte di un'immagine isolandola dal resto del contesto, ovvero, creare maschere opache per proteggere lo sfondo e modificare il soggetto oppure l'inverso.
Facendo uso di una maschera viene prelevata una porzione ovale da un'immagine (panorama di Firenze) e con questa creata una immagine nuova dove la porzione ovale precedente è su fondo trasparente.
Al posto dell'ovale può essere usata una qualsiasi altra figura chiusa.
Questa immagine viene poi copiata su di una mappa della Toscana in un punto a scelta, eventualmente cambindone le dimensioni.
L'operazione è fatta in 2 funzioni:
ApplicaMaschera(), dove applicando la maschra viene estratta la parte che interessa
CopiaEstrattoCon_
imagecopyresampled(), dove viene copiato l'estratto precedente sull'immagine finale.
Le varabili interessata sono:
$Cx, $Cx, centro X,Y della maschera
$RaggioX, $RaggioY, dimensione orizzontale e verticale della maschera
$GradiStart, $GradiEnd, punti di inizio e termine dell'arco prelevato per la maschera
$
imagecopyresampledX, $
imagecopyresampledY, punto X,Y dell'immagine finale dove verrà coopiato il contenuto della maschera
$IngrandimentoRiduzione, dimensioni della maschra copiata, 1 corrisponte alle dimensioni d'origine
Le immagini usate nello script sono:
Firenze.png, letta da supporto fisico e dalla quale estratta un porzione.
Toscana.png, letta da supporto fisico, su essa sarà copiata, in un punto a scelta, la porzione estratta.
<?php
$Cx = isset($_POST['Cx']) ? $_POST['Cx'] : 160;
$Cy = isset($_POST['Cy']) ? $_POST['Cy'] : 120;
$RaggioX = isset($_POST['RaggioX']) ? $_POST['RaggioX'] : 200;
$RaggioY = isset($_POST['RaggioY']) ? $_POST['RaggioY'] : 150;
$GradiStart = isset($_POST['GradiStart']) ? $_POST['GradiStart'] : 150;
$GradiEnd = isset($_POST['GradiEnd']) ? $_POST['GradiEnd'] : 30;
$
imagecopyresampledX = isset($_POST['
imagecopyresampledX']) ? $_POST['
imagecopyresampledX'] : 0;
$
imagecopyresampledY = isset($_POST['
imagecopyresampledY']) ? $_POST['
imagecopyresampledY'] : 0;
$IngrandimentoRiduzione=isset($_POST['IngrandimentoRiduzione'])?$_POST['IngrandimentoRiduzione']:1;
function ApplicaMaschera(&$Imma_Firenze, $Imma_Maschera, $Larghezza, $Altezza, $RaggioX,$RaggioY){
// nuova immagine dimensioni $Imma_Firenze
$Imma_FirenzeNEW =
imagecreatetruecolor($Larghezza, $Altezza);
$TrasparenzaAlpha =
imagecolorallocatealpha($Imma_FirenzeNEW,0,0,0,127 );// colore trasparente
imagesavealpha($Imma_FirenzeNEW, true); // salvataggio con trasparenza
imagefill($Imma_FirenzeNEW,0,0,$TrasparenzaAlpha); // rende l'immagine trasparente
for($x = 0; $x < $Larghezza; $x++ ){// legge pixel per pixel l'immagine $Imma_Maschera
for($y = 0; $y < $Altezza; $y++ ){
// risultato del pixel $alpha
$alpha =
imagecolorsforindex($Imma_Maschera,
imagecolorat($Imma_Maschera, $x, $y));
$alpha = 127 - floor( $alpha[ 'red' ] / 2 ); // opacità necessaria per $Imma_FirenzeNEW
// inserisce nell'array $color
$color =
imagecolorsforindex($Imma_Firenze,
imagecolorat($Imma_Firenze, $x, $y));
// alloca i colori con i dati letti alla riga precedente, qui può essere applicato un filtro colore
// ad esempio $color[ 'blue' ]>>1 per darle un effetto di antico
$K =
imagecolorallocatealpha($Imma_FirenzeNEW, $color[ 'red' ], $color[ 'green' ], $color[ 'blue' ], $alpha );
imagesetpixel($Imma_FirenzeNEW, $x, $y, $K); // scrive i nuovi dati
}}
// libera memoria e prosegue il ciclo
imagedestroy( $Imma_Firenze );$Imma_Firenze = $Imma_FirenzeNEW;
}
function CopiaEstrattoCon_
imagecopyresampled($Imma_Firenze,
$XX,$YY,
$RaggioX,$RaggioY,
$Cx , $Cy,
$
imagecopyresampledX,$
imagecopyresampledY,
$IngrandimentoRiduzione)
{
imagepng($Imma_Firenze,"es_126_CopiaEstrattoCon_
imagecopyresampled.png");// salva+++++
$Imma_Toscana =
imagecreatefrompng('Toscana.png');// carica immagine della Toscana
imagesavealpha($Imma_Toscana, true); // salvataggio con trasparenza
// dimensioni immagine da sovrapporre
$Imma_FirenzeX =
imagesx ($Imma_Firenze);$Imma_FirenzeY =
imagesy ($Imma_Firenze);
$XX = $RaggioX/2 - $Cx; // distanza zero margine sinistro
$YY = $RaggioY/2 - $Cy; // distanza zero dal margine superiore
$XX = $XX + $
imagecopyresampledX; // posizione orizzontale dove visualizzare estratto
$YY = $YY + $
imagecopyresampledY; // posizione verticale dove visualizzare estratto
// copia estratto da Firenze su mappa della Toscana
imagecopyresampled($Imma_Toscana , $Imma_Firenze ,
$XX * $IngrandimentoRiduzione, $YY * $IngrandimentoRiduzione, // x,y destinazione
0 , 0 , // x,y sorgente
$Imma_FirenzeX * $IngrandimentoRiduzione, $Imma_FirenzeY * $IngrandimentoRiduzione,
$Imma_FirenzeX, $Imma_FirenzeY // larghezza, altezza sorgente
);
$Nero =
imagecolorallocate($Imma_Toscana,0,0,0);
imagestring($Imma_Toscana ,4,10,200,"Imma_Firenze =".$Imma_FirenzeX."x".$Imma_FirenzeY , $Nero );
imagestring ($Imma_Toscana , 4 , 10 , 220 , "Raggi X,Y = ".$RaggioX."x".$RaggioY , $Nero );
imagestring ($Imma_Toscana , 4 , 10 , 240 , "Centro X,Y = ".$Cx."x".$Cy , $Nero );
imagepng($Imma_Toscana,"Toscana_Firenze_
imagecopyresampled.png");// salva+++++
}
// carica immagine esistente sulla quale verrà applicata la maschera
$Imma_Firenze =
imagecreatefrompng('es_126_Firenze.png');
$Larghezza =
imagesx($Imma_Firenze);$Altezza =
imagesy($Imma_Firenze); // preleva le dimensioni
$Imma_Maschera =
imagecreatetruecolor($Larghezza, $Altezza);// crea maschera stesse dimensioni
$Viola =
imagecolorallocate($Imma_Maschera, 255, 0, 255);// colore opaco per l'ellisse
// crea zona dove avverrà la copia del particolare di $Imma_Firenze
imagefilledarc($Imma_Maschera ,
$Cx , $Cy ,
$RaggioX , $RaggioY ,
$GradiStart , $GradiEnd ,
$Viola ,
IMG_ARC_PIE
);
imagepng($Imma_Maschera,"A_Maschera.png");// salva maschera++++
ApplicaMaschera($Imma_Firenze, $Imma_Maschera,
$Larghezza, $Altezza,
$RaggioX,$RaggioY
);// Applica la maschera
$XX = 0; // distanza dal margine sinistro della parte prelevata
$YY = 0; // distanza dal margine superiore della parte prelevata
CopiaEstrattoCon_
imagecopyresampled($Imma_Firenze,
$XX,$YY,
$RaggioX,$RaggioY,
$Cx , $Cy,
$
imagecopyresampledX,$
imagecopyresampledY,
$IngrandimentoRiduzione
);
imagepng($Imma_Firenze,"NomeFile.png");// salva
imagedestroy($Imma_Maschera);// libera memoria
?>