Newsgroup: it.comp.www.php
Titolo: Problemi con il resize di immagini PNG

Ciao a tutti.
Ho una funzione che prende un'immagine di partenza e la ridimensiona due 
volte, prima a 640px e poi a 160 (intendo il lato lungo, l'altro è 
calcolato mantenendo le proporzioni).
Tutto bene con le jpg. Se provo con una PNG funziona correttamente il 
resize a 640, mentre quello a 160 genera un'immagine totalmente nera 
(delle dimensioni giuste).
Il codice è identico (per creare la miniatura passo un ulteriore 
parametro all'interno della stessa funzione). Se c'è bisogno posto anche 
il codice, ma non vedo perchè se funziona a 640 non dovrebbe a 160...

 il codice, ma non vedo perchč se funziona a 640 non dovrebbe a 160...
posta il codice sě
-- 
e ziocan

 
http://phpfi.com/316871

il codice, ma non vedo perchè se funziona a 640 non dovrebbe a 160...
Per esempio perche' calcolando una media su (W/640)*(H/640/aspect) oppure
su (W/160)*(H/160/aspect), c'e' una differenza di un fattore 16. Che puo'
dare origine, per W e H abbastanza grandi, a un overflow.
Per dire, 2560x1920 (4:3 digitale) a 160x120, se una zona ha luminanza in
un intorno di 128, ti DOVREBBE venir fuori Y=32768/256=128 ... solo che a
16 bit (short int) hai overflow e viene fuori Y=0.
Oppure c'e' di mezzo una normalizzazione (visto succedere pure questo con
dati FWHM).
O magari la GD cerca di allocare memoria proporzionalmente a W/W', non ce
la fa ma ritorna lo stesso "okay", causando questo effetto.
Facendolo in due passate, questo non succede (ma ci metti piu' tempo).
Leonardo
-- 
The stars have not dealt me the worst they could do:
My pleasures are plenty - my troubles are two.
But oh!, my two troubles, they reave me of rest:

 Facendolo in due passate, questo non succede (ma ci metti piu' tempo).
Ho capito il discorso precedente, ma non questa cosa delle due passate: 
ho provato anche a mettere un'immagine di dimensioni minori di 640 ma 
maggiori di 160, così da effettuare solo il secondo resize:
la prima imageresize non farà nulla in quanto il lato lungo 
dell'immagine che ho passato è minore del limite imposto, mentre la 
seconda ridimensionerà a 160px. Ebbene, ancora immagine nera.

seconda ridimensionerà a 160px. Ebbene, ancora immagine nera.
Mah! Mistero. Non e' che puoi mettere online una di queste immagini
non resizabili? Sono curioso; magari se ci ravano un po' capisco da
dove arriva il problema.
Il test che hai fatto, effettivamente esclude la possibilita' di un
errore da overflow.


 dove arriva il problema.
L'ultima che ho provato (quella di dimensioni inferiori a 640) è stata 
questa:
http://snipurl.com/28zj7
E' presa a caso da google immagini, niente di che...
Grazie!



Mi funziona perfettamente. Ho usato il tuo codice mettendo Width_News a
300: non mi pare che per farci la thumbnail lo usi, ma ho provato anche
a generare una non-thumbnail.
Ho fatto le prove su un primitivo PHP 4.4 che ho sul portatile.


 
*_*
Quindi potrebbe essere un problema di server?? Più tardi allora lo provo 
su un altro e vediamo! Grazie

su un altro e vediamo! Grazie
Aggiornamento: PHP5 su OpenSuSE e l'ultimo PHP 4.x su Win2003, ambedue
funzionanti. Potrebbe essere una noia delle libGD?


 
Hai ragione. Ho provato in locale e funziona! Contatto chi gestisce il 
server e vedo di risolvere. Dici che sono da aggiornare le GD o che? Sul 
server c'è php 5.2.5 e gd: GD Version 	bundled (2.0.34 compatible) .
Grazie ancora




Ho trovato anche questo:
PHP 4.1.2-1
libgd 2.0.1-7
Apache 1.3.23-1
Linux, Debian Woody with libgd package selected from Sid
I experience problems using both ImageCopyResampled and 
ImageCopyResized on all PNGs loaded with ImageCreateFromPNG.
Source images that have a transparent background yield an all black
result image, no matter the source and destination sizes. The error is
either in ImageCreateFromPNG or the resize/resample functions, I do not
know which.
...cosa succede se COPI SENZA RICAMPIONARE la PNG in una nuova immagine
PRIVA DI TRASPARENZA?
Mi pare strano che un bug cosi' arcaico sia ancora in giro, ma... si sa
mai.


 mai.
PHP č abbastanza aggiornato, le libgd anche (la 2.0.34 č di circa 1 anno fa)

c'č?)?
Come vederla non lo so. Per copiare $a in $b DOVREBBE bastare
	// Entro con $a che e' la mia immagine
	$b = ImageCreateTrueColor(ImageSX($a), ImageSY($a));
	ImageCopy($b, $a, 0, 0, 0, 0, ImageSX($a), ImageSY($a));
	ImageDestroy($a);
	$a = $b; unset($b);
	// Ed esco sempre con $a, non e' cambiato nulla
Forse c'e' un sistema migliore con le funzioni GD per la trasparenza,
questo l'ho buttato giu' cosi' a caso, ti confesso.


 
E dici che dovrei risolvere? Cioč, tutte le img che ho provato finora 
allora hanno la trasparenza?

E dici che dovrei risolvere?
Non ne ho idea; e' una cosa da provare. So per esperienza che far
aggiornare il software server side (dove, forse, ci sono ennemila
altri siti web che *potrebbero* avere problemi nell'upgrade) e' a
tutti gli effetti un'impresa disperata.
