Newsgroup: it.comp.www.php
Titolo: Funzione per resize immagini, funziona e non funziona!

Ho scritto questa funzione che mi permette di ridimensionare le immagini:
http://phpfi.com/300195?lang=php
 (tutta la parte centrale che riguarda 
il processo di ridimensionamento vero e proprio potete saltarla e ora vi 
spiego il perchè...)
La chiamo in questo modo:
$img = imageresize($Path, $Nome_File, $ext, 0);
$tn = imageresize($Path, $Nome_File, $ext, 1);
In questo modo la seconda volta *dovrebbe* crearmi una miniatura, 
infatti all'interno della funzione c'è un   if ($Thumb) che modifica le 
dimensioni (diventa 160x120 invece che 800x600) e il nome e nient'altro.
Questo è l'output che mi da, in base agli echo che ho inserito:
800 600 ../img_news/1204543945964142.jpg siamo qui ok
160 120 ../img_news/tn_1204543945964142.jpg siamo qui errore
Ho inserito io degli spazi per farvi capire meglio.
La seconda volta fallisce, ma non riesco a capire il problema, la 
funzione è la stessa!
Ho anche provato a mettere 'tn' invece di 'tn_', nell'assurda ipotesi 
che il server avesse problemi con gli underscore, ma ovviamente niente...
C'è un limite minimo di dimensioni? Grazie per l'aiuto :)


Nessuno mi saprebbe aiutare? :/




Io vedo due cose poco sane in quel codice.
function imageresize($Path, $Nome_File, $ext, $Thumb)
{
    global $Width_News,$MaxW_News,$Height_News,$MaxH_News;
  if ($Thumb){
      $Width_News = 160;  
      $Height_News = 120;
      $Nome_File = 'tn_'.$Nome_File;
  }
  $img = $Path.$Nome_File.$ext;
  define('MAX_WIDTH', $Width_News);
  define('MAX_HEIGHT', $Height_News);
Qua sopra stai definendo una costante. Okay la prima volta... ma la
seconda siamo sicuri che funzioni?
Poi: quel $src e $dst che ti crei, non gli fai mai imageDestroy. La
prima volta tutto okay. La seconda volta, IN TEORIA la memoria deve
essere stata liberata... ma tu fallo, quell'imageDestroy. Non costa
niente e puo' dare soddisfazioni.
Infine: per il futuro, non dire "Cosi' da' errore". Sappiamo che ti
da' errore, se no mica venivi qui a dire "Cazzo! Funziona tutto! Mi
spiegate dov'e' che sbaglio?" :-D. Di' piuttosto QUALE errore da'.
La Santa Trinita' del debugging e':
	- cosa chiedi?
	- cosa ti aspetti?
	- cosa ottieni invece?
...e qui il "cosa ottieni" t'e' rimasto nella tastiera, il che mica
ci facilita le cose.
Fammi sapere,
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:

 spiegate dov'e' che sbaglio?" :-D. Di' piuttosto QUALE errore da'.
Eh, a saperlo! L'errore che dà è che imagejpeg() restituisce FALSE!
Comunque ho provato anche a togliere l'istruzione $Nome_File = 
'tn_'.$Nome_File; . Il risultato è che ora restituisce TRUE ma non va a 
sovrascrivere l'immagine frutto della prima chiamata con la miniatura 
frutto della seconda. Ora che mi ci fai pensare comunque potrebbe essere 
tutto dovuto alla imagedestroy...Domani provo! Grazie mille :)

 niente e puo' dare soddisfazioni.
Probabilmente era tutto dovuto all'assenza di imagedestroy. Ora l'ho 
messa, facendo qualche aggiustamento qua e là e funziona bene.
L'unica cosa che non va è che non riesco a passare da png a jpg: ho 
queste istruzioni:
if ( strpos($source_file,".png") ) { $img_source = 
imagecreatefrompng($source_file); }
imagecopyresampled($thumbnail, $img_source, 0, 0, 0, 0, $new_width, 
$new_height, $img_width, $img_height);
imagejpeg( $thumbnail, $destination_file, 80 )
e succede che crea correttamente le due immagini (la prima a larghezza 
800, la seconda 160), solo che la miniatura è un'immagine totalmente 
nera (delle dimensioni esatte).
Tra l'altro crea fisicamente dei file .png... insomma, non capisco 
l'utilizzo di imagejpeg rispetto a imagepng e soprattutto perchè non 
funziona a 160 ma funziona a 800 *_*
Grazie ancora!

nera (delle dimensioni esatte).
Quanto e' grossa la PNG che gli dai in pasto? :-)


 
Neanche tanto, 85kb, 1280x1024 (è uno screenshot del mio computer).
Ma il mistero è che a 800x600 la vedo, a 160 vedo una img nera




Okay. 1280 x 1024 deve diventare 160 x 128.
Questo vuol dire una riduzione di 8:1, cioe' ogni pixel della thumbnail
e' la media di 8x8 = 64 pixel nell'immagine originaria.
La mia ipotesi e' che nel fare la somma dei pixel e dividendoli per 64,
si verifichi un errore interno di arrotondamento che non si verifica ad
esempio scendendo a 800x600 (dove ogni pixel e' la media su nemmeno 4).
La prova si fa facilmente: ottieni la thumbnail in due passaggi non dal
file originario ma dal file ridotto a 800x600. Cosi' la divisione e' un
po' meno forte, solo 1/25.
Se no puoi provare a fare il resize prima a 320x256, e poi da 320x256 a
160x128. Cosi' la prima divisione e' per 16 e la seconda e' per 4.
Leonardo e un'ipotesi campata in aria


 Leonardo e un'ipotesi campata in aria
Mm strano davvero, dovrei informarmi un po'..per ora blocco l'upload 
permettendo solo le jpg e chi s'è visto s'è visto :D

 nera (delle dimensioni esatte).
E' un png a 32 bit con alpha channel?
-- 
ValeRyo - GS500F "Camilla"
Comitato Per La Salvaguardia Dell'Italiano
E anche tu potrai dire: quest'hanno c'è l'ho l'iscrizione!
Se impareremmo i congiuntivi fossimo persone migliori! 

 
24 bit è ciò che sono riuscito a scovare dalle proprietà immagine...ma 
comunque a 800 la ridimensiona eh ^^

 ha scritto nel messaggio
news:9YDzj.7482$
q53....@tornado.fastwebnet.it

Io i problemi li ho avuti con l'alpha channel... puoi postare il codice che
ti da' l'errore e magari un link all'immagine? Così provo anche io.


 
Il codice č a grandi linee questo: 
http://phpfi.com/300860
Io l'ho modificato leggermente in modo tale che se passo un ulteriore 
parametro alla funzione allora cambiano le dimensioni e diventa 160 
invece di 800 (utilizzo la stessa funzione per ridimensionare e per 
creare la miniatura).
Non posso fartelo provare direttamente sul mio perchč non č ancora online!

 creare la miniatura).
E quando ridimensioni a 160 il risultato è un rettangolo nero?
Hai un'immagine che ti causa il problema da passarmi?
