I filtri non sono altro che delle funzioni predefinite che permettono di "fare qualcosa" alle immagini, ma possono anche essere fatti da chiunque abbia un pò di dimestichezza con colori e pixel a volte perfino creando qualcosa più adatto ad una situazione contingente.
Nella funzione ' Applica_filtro ', vengono eseguite manipolazioni sui colori simulando filtri già pronti in GD.
Una dimostrazione di come sia possibile, da programmazione, modificare i colori di ogni singolo pixel dando all'immagine l'effetto che più si desidera.
L'esempio è formato da una funzione che viene invocata 3 volte passandole ogni volta ciascuno i tre colori RGB in quantità diversa.
Ulteriori effetti possono essere avuti cambiando i colori ai quali è applicato lo spostamento bit alla riga:
$Rosso = $RGB & 255; $Verde = ($RGB >> 8) & 255; $Blu = ($RGB >> 16) & 255;
<?php
function Applica_filtro($L,$Immagine,$Rosso,$Verde,$Blu){
$Rs = $Rosso; $Vs = $Verde; $Bs =$Blu; // recupera valori per nome del file da salvare
$RGB = $Rosso + $Verde + $Blu;
$Colore = array($Rosso/$RGB, $Blu/$RGB, $Verde/$RGB);
$Imma_larg =
imagesy($Immagine); $Imma_alt =
imagesx($Immagine); // dimensioni del'immagine
for($x=0; $x<$Imma_alt; $x++) // scansiona immagine sull'asse x
{
for($y=0; $y<$Imma_larg; $y++) // scansiona immagine sull'asse y
{
$RGB =
imagecolorat($Immagine, $x, $y); // l'egge il colore del pixel
// Sposta verso destra i bit,(spostamento è aritmetico),i bit spostati fuori delle estremità sono scartati
$Rosso = $RGB & 255; $Verde = ($RGB >> 8) & 255; $Blu = ($RGB >> 16) & 255;
$RossoNEW = floor($Rosso*$Colore[0] + $Verde*$Colore[1] + $Blu*$Colore[2]); // nuova quantità di rosso
$VerdeNEW = floor($Rosso*$Colore[2] + $Verde*$Colore[0] + $Blu*$Colore[1]); // nuova quantità di verde
$BluNEW = floor($Rosso*$Colore[1] + $Verde*$Colore[2] + $Blu*$Colore[0]); // nuova quantità di blu
// scrive nel pixel il nuovo colore
imagesetpixel($Immagine, $x, $y,
imagecolorallocate($Immagine, $RossoNEW, $VerdeNEW, $BluNEW));
}
}
imagejpeg($Immagine, "NomeFile_filtro_".$L." R=".$Rs."-".$RossoNEW."_G=".$Vs."-".$VerdeNEW." B=".$Bs."-".$BluNEW.".jpg"); // salva
imagejpeg($Immagine); // al browser
}
header ("Content-type: image/jpeg");
$Immagine =
imagecreatefromjpeg("firenze_start.jpg");
$Rosso = 185; $Verde = 72; $Blu = 1; Applica_filtro("A",$Immagine,$Rosso,$Verde,$Blu);
$Rosso = 18; $Verde = 70; $Blu = 180; Applica_filtro("B",$Immagine,$Rosso,$Verde,$Blu);
$Rosso = 18; $Verde = 170; $Blu = 18; Applica_filtro("C",$Immagine,$Rosso,$Verde,$Blu);
?>
Risultato: