Newsgroup: it.lavoro.professioni.webmaster
Titolo: Impostazione dimensioni immagine .php

Buongiorno ragazzi,
avrei bisogno di una mano: come dovrei modificare il seguente codice php in 
modo da impostare le dimensioni dell'immagine visualizzata (es:800x640)?
Grazie mille
Luca
 
<?php
 
$nome_immagine="immagine.jpg";   $nome_testo="testo.txt";   // file 
contenente le scritte
 
$fp = fopen($nome_testo,"r")
   or die("impossibile aprire il file testo.txt.");
$testo_sinistra=fgets($fp,200);   // nella prima riga la scritta allineata a 
sinistra
$testo_destra=fgets($fp,100);   // nella seconda riga la scritta allineata a 
destra
if ( $testo_destra = "data" )
   {
   setlocale(LC_TIME,"it_IT");
   $testo_destra=strftime ("%a %d %b %Y %H:%M:%S", 
filemtime($nome_immagine));
   }
fclose($fp);
 
header("Content-type: image/png");
 
$im  = imagecreatefromjpeg($nome_immagine);
//$black = imagecolorallocate($im, 0, 0, 0);
//$white = imagecolorallocate($im, 255, 255, 255);
$colore_barra = imagecolorallocate($im, 1, 0, 128);  // colore della barra 
formato RGB
$colore_testo  = imagecolorallocate($im, 255, 255, 255); // idem per testo
$x=imagesx($im);
$y=imagesy($im);
 
$font = "VeraBd.ttf";
$size = 35;       // dimensione del testo
$altezza_barra = 45;      // dimensione della barra
 
 
imagefilledrectangle($im, 0, $y-$altezza_barra, $x-1, $y-1, $colore_barra);
 
$bbox = imagettfbbox ($size, 0, $font, $testo_sinistra);
$dy   = (($bbox[1] - $bbox[7]) / 2);
imagettftext($im, $size, 0, 5, $y-($altezza_barra / 2) + $dy - 1, 
$colore_testo, $font, $testo_sinistra);
 
$bbox = imagettfbbox ($size, 0, $font, $testo_destra);
$dx   = ($bbox[2] - $bbox[0]);
imagettftext($im, $size, 0, $x-5-$dx, $y-($altezza_barra / 2) + $dy - 1, 
$colore_testo, $font, $testo_destra);
 
 
 
$info = getimagesize($nome_immagine);
$logo = imagecreatefrompng("raccolta.png") ;
imagecopy($im, $logo, 0, $info[1]- 245,0,0,1652,200);
imagejpeg($im);
imagedestroy($im);
?>
 
 
 
 
 

modo da impostare le dimensioni dell'immagine visualizzata (es:800x640)?
 
Quello script ha parecchi difetti.
 
Il primo che vedo così a volo d'uccello è che manda un Content-Type di
image/png, però poi invia una immagine JPEG. Su parecchi browser, quel
che vedi è un riquadro bianco con la scritta "immagine danneggiata".
 
Poi, il sistema elegante sarebbe di prendere questa immagine
 
	$im  = imagecreatefromjpeg($nome_immagine);
 
e rifarla a 800x640. E modificare il codice che scrive le scritte così
che le scriva un po' più grosse o più piccine in un posto migliore.
 
Altrimenti, rapidu iom pli ci sono due alternative:
 
1) Ridimensioni l'immagine subito. Le scritte e quant'altro rimarranno
   delle dimensioni originarie, ma la loro posizione potrebbe cambiare
   e la percentuale di spazio occupato diminuisce (o aumenta; e magari
   vanno fuori dall'immagine).
 
   Questo lo fai mettendo, SUBITO DOPO l'imagecreatefromjpeg, l'ordine
   di ridimensionare l'immagine:
 
	$new	= ImageCreateTrueColor(800, 640); // Nuova immagine
	ImageCopyResampled($new, $im,
		0, 0,	// A questa posizione (senza bordo)
		0, 0,	// da questa posizione
		ImageSX($new), ImageSY($new),	// Coprendo tutto
		ImageSX($im), ImageSY($im)	// Prendendo tutto
		);
	ImageDestroy($im);	// im non serve più
	$im = $new;		// Il resto dello script si aspetta im
	unset($new);		// Sempre distruggere le prove.
 
2) Ridimensioni l'immagine finale. Le scritte sgraneranno (un pochino)
   ma il risultato sarà la stessa immagine di prima, solo ingrandita o
   rimpicciolita (o anche DISTORTA se il rapporto altezza/larghezza e'
   variato). Se le scritte non sbordavano prima, non lo faranno adesso
   - pero' se rimpicciolisci troppo, non leggi piu' un accidenti.
 
   Questo lo fai mettendo le stesse righe di sopra, SUBITO PRIMA della
   riga in cui invii l'immagine con ImageJPEG($im).
 
3) Ridimensioni come sopra ma aggiungendo un bordo asimmetrico in modo
   da diminuire eventuali effetti di distorsione. Per es., se parti da
   una immagine di 640x480, e ora vuoi 800x640, 640/480 = 1.33, mentre
   800/640 = 1.25, cioe' l'immagine ti viene più "slungata". Per avere
   una larghezza di 800, ti servirebbe un'altezza di 800/1.33 = 600. E
   allora tu metti (640-600)/2 = 20 pixel di bordo in alto e in basso:
   ti basta mettere ImageSY($im) al posto di ImageSY($new), e al posto
   di 0,0 nella nuova posizione ("a"), ci metti 0,20. Come colorare il
   bordo con ImageRectangle o farlo trasparente, e' lasciato a piacere
   dello studente :-)
 
Comunque fidati poco: come vedi, 'un son bono neanche a contare fino a
tre.
 
Leonardo
 
-- 
Tell us whether you spy, in the light of the morn,
what saluted was fiercely at the fall of the past day:
whose pips and whose bands in the very heart of the fray
bravely floated from the bulwarks to which we were sworn?

   riga in cui invii l'immagine con ImageJPEG($im).
 
Ciao Leonardo,
grazie per la risposta.
Ho scelto l'opzione 2 ma, nonostante il rapporto altezza/larghezza non sia 
cambiato rispetto al jpeg originale, l'immagine risulta più "sporca" 
(ovviamente si nota meglio di giorno): come mai?
Confronta cam30.php (ottenuta seguendo le istruzioni qui riportate) con 
l'immagine originale presente sul sito (delle stesse dimensioni di 
cam30.php, ma ridimensionata direttamente nel codice html della pagina) e 
vedrai che la prima presenta un maggiore "rumore" rispetto alla seconda, ma 
non ho capito bene da cosa dipenda:
 
http://www.sassimatera.net/webcam/cam30.php
 
http://www.sassimatera.net/webcam/webcam_sassi_di_matera.html
 
 
Grazie mille
 
Luca
 


http://www.sassimatera.net/webcam/webcam_sassi_di_matera.html
 
 
Il rumore è quello di una quantizzazione JPEG. 1.15 bit per pixel, 75% di
fattore di qualita', chroma subsample 2,2 che da' l'effetto "fangoso".
 
Prova a modificare solo la riga "ImageJPEG" come visto sopra specificando
una qualita' di 95 (puoi sperimentare. Con 75, ottieni la solita foto con
rumore). Se mi ricordo bene [1], il chroma subsample diventa 1,1 (massima
qualita') per valori superiori a 85.
 
Volendo, c'e' una quantita' di trucchi che si possono mettere in pratica.
 
Leonardo che lo fa di lavoro
 
[1] di solito, no, non mi ricordo bene, sicche' prova :-)
