Newsgroup: it.comp.www.php
Titolo: GD e trasparenze

Salve a tutti,
ho deciso di postare perché non so più cosa devo pensare: sto cercando 
di realizzare uno script per ridimensionare automaticamente alcune 
immagini provenienti da un form, e non riesco a capire come gestire le 
trasparenze.
Con le jpg non ci sono stati problemi (non ci sono trasparenze! :)), 
quando sono arrivato alle gif invece mi sono accorto che l'immagine 
creata da imagecreatefromgif() non legge le eventuali trasparenze 
presenti nell'immagine.
Ho cercato di aggirare il problema creando un'immagine trasparente e 
facendo il merge dell'originale sull'immagine vuota:
$src_img = imagecreatefromgif($file);
$tmp_img = imagecreatetruecolor($width, $height);
$trasp = imagecolorallocate($tmp_img, 255, 0, 0);
imagecolortransparent($tmp_img, $trasp);
imagecopymerge($tmp_img,$src_img,0,0,0,0,$width,$height,100);
Ma in questo modo, se l'immagine originale contiene lo stesso colore a 
cui ho impostato la trasparenza, appariranno dei buchi nell'immagine. 
Possibile che non ci sia un'altra strada?
Inoltre il procedimento che ho utilizzato non funziona bene: 
nell'esempio che ho riportato ho dato - in teoria - la trasparenza al 
colore rosso (255,0,0); in realtà il colore che viene sostituito nelle 
mie immagini è il nero (?!?), e oltretutto se provo a cambiare i valori 
lo script non gestisce più le trasparenze (ho provato varie 
combinazioni, tra cui anche 0,0,0).
Cosa devo pensare? Il manuale (
php.net
) non mi è di grande aiuto, le 
informazioni su gd non sono aggiornatissime (da una parte c'è scritto di 
utilizzare createimagetruecolor per gestire le gif, e nella pagina di 
createimagetruecolor c'è scritto che questo formato non funziona con le 
gif!), e sui vecchi post non ho trovato nulla che facesse al caso mio.
Datemi qualche spunto se potete, per la cronaca sto facendo le mie prove 
su un server di prova e uno spazio web preconfigurato, ed entrambi hanno 
la versione 2.0.28 compatible di gd. Grazie in anticipo,
Ale


mi disp ma io uso le imagemagick, se decidi di adottarle anche tu ti
posso aiutare.

 posso aiutare.
Oddio, ci ho messo un po' a capire come funzionava GD, adesso mi 
scoccierebbe un po' ricominciare da capo. Cmq come faccio a sapere se 
sono installate su un server? Di solito uso degli hosting, quindi non 
posso installare nulla sul server...

bene, a quanto pare ho preso una cantonata, e quello che mi scoccia 
maggiormente è essermene accorto appena mezzora dopo aver postato sul NG :(
A quanto pare il mio problema nasceva dall'uso di createimagetruecolor() 
per creare le immagini; è bastato utilizzare createimage() per risolvere 
  tutti i miei problemi con 6 righe di codice:
$src_img = imagecreatefromgif($file);
$dst_img = imagecreate($new_width, $new_height);
$trasp = imagecolorallocate($dst_img, 255, 255, 255);
imagecolortransparent($dst_img, $trasp);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$new_width,$new_height,imagesx($src_img),imagesy($src_img)); 
imagegif($dst_img, $dir_img."/".$start_file.$nome);
Evidentemente ci sono problemi con le immagini truecolor e la 
trasparenza, eppure ero sicuro di aver letto sul manuale che bisognava 
utilizzare le immagini truecolor per quello che dovevo fare... boh, avrò 
capito male! :(
Adesso non mi resta che scrivere il codice per i file png... speriamo 
bene!! :)

 bene!! :)
Dai un'occhi a questo:
http://it.php.net/manual/it/function.imagecopy.php#27287

 
http://it.php.net/manual/it/function.imagecopy.php#27287
Ti ringrazio per il link, comunque la mia esigenza era un po' diversa: 
il metodo riportato in quel post fa riferimento alla creazione di 
sovrapposizioni di immagini partendo da immagini create da te; a me 
invece serviva uno script che lasciasse intatte le trasparenze perché 
non so che immagini ci verranno caricate!
Quindi il mio procedimento per creare le gif è stato:
- creo un'immagine vuota
- le do un fondo trasparente
- sovrappongo all'immagine vuota l'immagine originale (se serve la 
ridimensiono) e salvo il file.
Fortunatamente per la gestione della trasparenza nei png sono riuscito 
subito a trovare quello che mi serviva:
imagealphablending($img, FALSE);
imagesavealpha ($img, TRUE);
Con queste due righe faccio in modo che i valori alpha dell'immagine 
siano conservati: infatti, mentre il formato gif assegna la trasparenza 
ad un singolo colore (per cui l'immagine è trasparente solo nei pixel 
dove è stato impostato quel colore), il formato png gestisce il valore 
di trasparenza di ogni singolo pixel, per cui un pixel può essere opaco, 
trasparente o anche essere solo parzialmente trasparente!
Ciao,
Ale