Newsgroup: it.comp.www.php
Titolo: galleria immagini e aspect ratio

Come posso impostare uno script che mi permette di mantenere un aspect ratio
il quanto più possibile equilibrato ma che in ogni caso non debba superare
i 500px in larghezza e i 300px in altezza?
Mi spiego meglio, ho fatto uno script che fa l'upload e ridimensionamento
delle immagini, il box che mi mostra le immagini è largo massimo 500px e
alto massimo 300px...le immagini che visualizzo devono essere contenute al
suo interno...possono starci foto più piccole ma non foto che eccedano una
delle due misure.
Questa è la porzione di codice che ormai non corrisponde più alla mia prima
bozza :-) :
$wi=500;
$he=300;
if($width > $wi or $height > $he){
$he=$height*($wi/$width);
$thumbnail = imagecreatetruecolor($wi, $he);
$source = imagecreatefromjpeg($_FILES['image']['tmp_name']);
imagecopyresized($thumbnail, $source, 0, 0, 0, 0, $wi, $he, $width,
$height);
// Salvo l'immagine ridimensionata;
imagejpeg($thumbnail, "../images/img_prodotti/".$_POST['dir_sezione']
$_POST['dir_stile'].$_FILES['image']['name']);
$msg_ok = "<p class=\"ok\">Immagine caricata e ridimensionata
correttamente</p>";
}
Qualcuno sa darmi una dritta?
Grazie mille!!!
gp
-- 
ln -s /dev/brain /dev/null

Ho adottato questa soluzione che è pure facendo, al momento, il suo compito
non credo sia tanto funzionale e nemmeno così snella, anzi...
$wi=500; $he=300;
if($width>=$height and ($width>$wi or $height>$he)){
  if($width > $wi){
      $he=$height*($wi/$width);
      if($he>300) $he=300;
      $thumbnail = imagecreatetruecolor($wi, $he);
      $source = imagecreatefromjpeg($_FILES['image']['tmp_name']);
      imagecopyresized($thumbnail, $source, 0, 0, 0, 0, $wi, $he, $width,
$height);
      // Salvo l'immagine ridimensionata;
      imagejpeg($thumbnail, "../images/img_prodotti/".$_POST['dir_sezione']
$_POST['dir_stile'].$_FILES['image']['name']);
      $msg_ok = "<p class=\"ok\">Immagine caricata e ridimensionata
correttamente</p>";      
  }
} else if($width<$height and ($width>$wi or $height>$he)){
    if($height > $he){
      $wi=$width*($he/$height);
      if($wi>500) $wi=500;
      $thumbnail = imagecreatetruecolor($wi, $he);
      $source = imagecreatefromjpeg($_FILES['image']['tmp_name']);
      imagecopyresized($thumbnail, $source, 0, 0, 0, 0, $wi, $he, $width,
$height);
      // Salvo l'immagine ridimensionata;
      imagejpeg($thumbnail, "../images/img_prodotti/".$_POST['dir_sezione']
$_POST['dir_stile'].$_FILES['image']['name']);
      $msg_ok = "<p class=\"ok\">Immagine caricata e ridimensionata
correttamente</p>";
    }
}
Secondo voi come potrei 'pulirla' ?


 Secondo voi come potrei 'pulirla' ?
Non so se ho capito bene le tue esigenze, ma forse qualcosa del genere:
$x e $y sono le dimensioni massime desiderate.
$origimage = imagecreatefromxxx(immagine);
$oldx = imagesx($origimage);
$oldy = imagesy($origimage);
$width = $x;
$height = intval(($oldy * $width) / $oldx);
if ($height > $y) {
	$height = $y;
	$width = intval(($oldx * $height) / $oldy);
}
$dstimg = imagecreatetruecolor($width, $height);
imagecopyresampled($dstimg, $origimage, 0, 0, 0, 0,
                     $width, $height, $oldx, $oldy);
Bye.

 
Così effettivamente è più leggibile.
Il mio problema originale era però questo, spero di essere più chiaro con
questo esempio.
Voglio che l'immagine sia ridimensionata se:
a. o larghezza > 500
b. o altezza > 300
c. larghezza > 500 e altezza >300
In tutti gli altri casi le dimensione rimangono inalterate, purchè una di
loro, come detto, non superi uno od entrambi i limiti che ho definito.
Il tutto mantenendo un aspect ratio equilibrato.
Il problema che sorge però è che se, ad esempio, ho un'immagine di origine
eccessivamente alta e che nello stesso tempo è poco più larga di 500, il
ridimensionamento avviene ma l'immagine risultante esce comunque fuori
margine del suo box contenitore che è 500x300 massimo.
Quel che voglio in sostanza è avere un'immagine che rientri nei 500x300.
Es: 250x300 ok, 500x200 ok, 400,200 ok, 600,250 no, 400, 500 no, etc...
Spero di essere stato più chiaro...ora ho semi risolto con un *accrocchio*
momentaneo ma non è per niente una soluzione stabile e sicura.


 Quel che voglio in sostanza è avere un'immagine che rientri nei 500x300.
Non lo vedo un grande problema. Ridimensioni l'immagine facendo in modo 
che il lato maggiore tra i due rientri nelle specifiche, oppure 
considerando a seconda del lato che si discosta di più dalla specifica.
Male male che vada, puoi ridimensionare due volte, una per rientrare 
nella specifica del lato più lungo, e se non ce la fai a ottenere la 
dimensione voluta, esegui un altro ridimensionamento per rientrare 
nella specifica del lato più corto (ma forse questo secondo 
ridimensionamento può addirittura essere superfluo).
In conclusione, con una semplice proporzione puoi controllare se con il 
ridimensionamento rientreresti nelle specifiche.
--
rob4you

i 500px in larghezza e i 300px in altezza?
Il modo migliore e' quello di IMPORRE una dimensione WIDTH x HEIGHT, e poi
aggiungere dei bordi trasparenti (che pesano poco) in alto e in basso, o a
destra e a sinistra.
Prendi una immagine W1 x H1. Questa ha un aspect ratio di W1/H1. Se questo
e' maggiore di WIDTH/HEIGHT, allora devi fare un resize su width, e quindi
	NW = W1 * WIDTH / W1; // Che poi e' WIDTH
	NH = H1 * WIDTH / W1;
Se e' minore, avrai
	NW = W1 * HEIGHT / H1;
	NH = H1 * HEIGHT / H1; // Che poi e' HEIGHT
Ovvero:
	$nw = ($W1*$HEIGHT > $H1*$WIDTH) ? $WIDTH : $W1 * $HEIGHT / $H1;
	$nh = ($W1*$HEIGHT > $H1*$WIDTH) ? $H1 * $WIDTH / $W1 : $HEIGHT;
Adesso questa immagine deve essere centrata in (WIDTH x HEIGHT), cioe', la
devi copiare in modo che il suo centro sia nel nuovo centro. Quindi la sua
origine va in
	$X1 = (int)(($WIDTH - $nw)/2)
	$Y1 = (int)(($HEIGHT - $nh)/2)
(Per riprova: X1*Y1 __dovrebbe__ fare zero)
Quindi:
	1. Crei una immagine WIDTH x HEIGHT con ImageCreateTrueColor,
	   e sia Dest, con trasparenza, alpha e sfondo di tuo gusto;
	2. Calcoli NW e NH, X1 e Y1
	3. Usi ImageCopyResampled dalle coordinate 0,0 di Source alle
	   coordinate X1,Y1 di Dest
L'immagine Dest... se non ho fatto colossali cazzate (possibilissimo), ora
ha dimensioni WIDTH x HEIGHT ed e' centrata con bordi trasparenti.
*Dovrebbe* essere quello che hai chiesto... ma vista l'ora ti chiedo scusa
in anticipo se non dovesse esserlo.
Leonardo
-- 
There is nothing makes a man suspect much, more than to know little,
and therefore men should remedy suspicion by procuring to know more,
and not keep their suspicions in smother.            (Francis Bacon)

 in anticipo se non dovesse esserlo.
Anche a tarda ora....sei sempre nel giusto! :-)
--
rob4you

 
A quest'ora dopo una giornata niente male non sono più in grado di leggere
quanto hai scritto...domani leggo per bene...ad ogni modo mentre postavate
io avevo provvisoriamente risolto così anche se non mi convince tanto:
$wi=500; $he=300;
if($width>=$height and ($width >= $wi or $height>=$he)){
  if($width >= $wi or $height>=$he){
      $he=$height*($wi/$width);
      if($he>300) $he=300;
      $thumbnail = imagecreatetruecolor($wi, $he);
      $source = imagecreatefromjpeg($_FILES['image']['tmp_name']);
      imagecopyresized($thumbnail, $source, 0, 0, 0, 0, $wi, $he, $width,
$height);
      // Salvo l'immagine ridimensionata;
      imagejpeg($thumbnail, "../images/img_prodotti/".$_POST['dir_sezione']
$_POST['dir_stile'].$_FILES['image']['name']);
      $msg_ok = "<p class=\"ok\">Immagine caricata e ridimensionata
correttamente</p>";      
  }
} else if($width<$height and ($width >= $wi or $height>=$he)){
    if($height >= $he or $width>=$wi){
      $wi=$width*($he/$height);
      if($wi>500) $wi=500;
      $thumbnail = imagecreatetruecolor($wi, $he);
      $source = imagecreatefromjpeg($_FILES['image']['tmp_name']);
      imagecopyresized($thumbnail, $source, 0, 0, 0, 0, $wi, $he, $width,
$height);
      // Salvo l'immagine ridimensionata;
      imagejpeg($thumbnail, "../images/img_prodotti/".$_POST['dir_sezione']
$_POST['dir_stile'].$_FILES['image']['name']);
      $msg_ok = "<p class=\"ok\">Immagine caricata e ridimensionata
correttamente</p>";
    }
}
gp


 imagecopyresized($thumbnail, $source, 0, 0, 0, 0, $wi, $he, $width,
$rapporto = min($maxlargh / $largh, $maxalt / $alt);
$nuovalargh = $largh * $rapporto;
$nuovaalt = $alt * $rapporto;
Poi fai imagecopyresized.
-- 
ColdShine
"L'esperienza è un'insegnante severa: prima ci esamina
 e solo dopo ci fa lezione." - legge di Vernon Sanders 

 momentaneo ma non č per niente una soluzione stabile e sicura.
list($width, $height, $type, $attr) =
getimagesize($_FILES['img']['tmp_name']);
$new_x=500;
$new_y=300;
if ($width>$new_x||$height>$new_y){
  if($width<$height) {
    $new_x=(int)(($new_y/$height)*$width);
  }else{
    $new_y=(int)(($new_x/$width)*$height);
  }
 
  // Creo la thumbnail
  $thumb = imagecreatetruecolor($new_x, $new_y);
  $source = imagecreatefromjpeg($_FILES['img']['tmp_name']);
  imagecopyresampled($thumb, $source, 0, 0, 0, 0, $new_x, $new_y, $width,
$height);
}else{
  $thumb=imagecreatefromjpeg($_FILES['img']['tmp_name']);
}
 
  // Salvo l'immagine ridimensionata
  imagejpeg($thumb,"../img/news_foto/news_".$id_news.".jpg", 75);
Ciao Stefano