Newsgroup: it.comp.www.php
Titolo: Ridimensionamento immagini

Ciao a tutti,
per creare delle thumbnail al volo utilizzo uno script PHP che prenda un 
immagine recuperata da un database MySQL e la ridimensioni in base alla 
larghezza o all'altezza che gli dichiaro tramite una variabile.
Il ridimensionamento dell'immagine viene effettuato tramite queste 
funzioni (in questo caso, nel caso in cui io dichiari la larghezza):
A = round($L*$size[1]/$size[0]);
$im = imagecreate($L,$A);
imagecopyresized($im,$src,0,0,0,0,$L,$A,$size[0],$size[1]);
imagejpeg($im);
imagedestroy($im);
Il tutto funziona bene, con la piccola bruttura che l'immagine 
ridimensionata non viene restituita alla qualità dell'immagine 
originale, sia per quanto riguarda la risoluzione (si vede tutta 
sgranata) che per quanto riguarda i colori (vengono tutti sfasati). Il 
peso dell'immagine diminuisce regolarmente.
Come posso risolvere il problema? In pratica io vorrei che lo script 
ridimensionasse l'immagine senza perdere la qualità dell'immagine originale.
Grazie mille
Ciao
Decibel

 sgranata) che per quanto riguarda i colori (vengono tutti sfasati).
Tieni presente che uno script del genere appesantisce molto il carico
del server per cui, probabilmente, sarebbe meglio utilizzare un qualche
sistema di caching delle immagini ridimensionate.
Puoi provare: 
[quoto bq7jsd$pic$
1...@newsread.albacom.net
]
Usa imagecreatetruecolor come base per l'immagine finale. Quando poi
usi
imagejpeg puoi settare la qualità.
Se le taglia invece di ridimensionare suppongo sia colpa di qualche 
errore nel codice.
[/quoto]
-- 
I am what I am, I do what I can
L'uomo, conscio di sbagliare, persevera.

 [/quoto]
Ok, ora ci provo...
Grazie mille
Ciao

 sito (che però non sembra il mio) che appunto appesantisce il server?
Questo mi pare evidente.
Il sistema piu' utilizzato prevede di archiviare una versione
ridimensionata all'atto del salvataggio/upload dell'immagine, molto
piu' efficiente etc. In alternativa puoi salvarlo all'atto della prima
generazione e, se e' presente una versione cached non generarla
nuovamente ma ricaricare la versione cached.


 nuovamente ma ricaricare la versione cached.
Ok, in un secondo tempo ci lavoro...
Per quanto riguarda il problema della forte perdita di qualità non sono 
riuscito a cavare un ragno dal buco.
Posso mandarti in privato il link dello script?
Grazie mille
Ciao
Decibel

 il link dello script?
Ti suggerisco di leggere i commenti alla funzione imagecopyresized
http://www.php.net/imagecopyresized#usernotes
Utilizzando un commento che conteneva il seguente codice penso tu possa
risolvere i tuoi problemi.
<?php 
function createthumb ($IMAGE_SOURCE, $THUMB_X, $THUMB_Y, $OUTPUT_FILE){
  $BACKUP_FILE = $OUTPUT_FILE . "_backup.jpg";
  copy($IMAGE_SOURCE,$BACKUP_FILE);
  $IMAGE_PROPERTIES = GetImageSize($BACKUP_FILE);
  if (!$IMAGE_PROPERTIES[2] == 2) {
   return(0);
  } else {
   $SRC_IMAGE = ImageCreateFromJPEG($BACKUP_FILE);
   $SRC_X = ImageSX($SRC_IMAGE);
   $SRC_Y = ImageSY($SRC_IMAGE);
   if (($THUMB_Y == "0") && ($THUMB_X == "0")) {
     return(0);
   } elseif ($THUMB_Y == "0") {
     $SCALEX = $THUMB_X/($SRC_X-1);
     $THUMB_Y = $SRC_Y*$SCALEX;
   } elseif ($THUMB_X == "0") {
     $SCALEY = $THUMB_Y/($SRC_Y-1);
     $THUMB_X = $SRC_X*$SCALEY;
   }
   $THUMB_X = (int)($THUMB_X);
   $THUMB_Y = (int)($THUMB_Y);
   $DEST_IMAGE = imagecreatetruecolor($THUMB_X, $THUMB_Y);
   unlink($BACKUP_FILE);
   if (!imagecopyresized($DEST_IMAGE, $SRC_IMAGE, 0, 0, 0, 0, $THUMB_X,
$THUMB_Y, $SRC_X, $SRC_Y)) {
     imagedestroy($SRC_IMAGE);
     imagedestroy($DEST_IMAGE);
     return(0);
   } else {
     imagedestroy($SRC_IMAGE);
     if (ImageJPEG($DEST_IMAGE,$OUTPUT_FILE)) {
       imagedestroy($DEST_IMAGE);
       return(1);
     }
     imagedestroy($DEST_IMAGE);
   }
   return(0);
  }
} # end createthumb 
createthumb ('test.jpg', 80, 88, 'test2.jpg');
?>
-- 
I am what I am, I do what I can
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Cerchi un programmatore PHP/MySQL? 
http://url.repository.biz/go/1Y


 
http://www.php.net/imagecopyresized#usernotes
Nei commenti viene suggerito di non usare la funzione imagecopyresized() 
in quanto, come hai detto tu, appesantisce troppo la CPU del server e 
spesso occupa tutta la memoria.
Ma allora che funzione usare per ridimensionare l'immagine?
Grazie, ciao
Decibel

 funzione usare per ridimensionare l'immagine?
Accade solo se lo utilizzi su immagini molto grandi o fa "sedere" il
server se lo utilizzi in continuazione.
Se implemnti un sistema di caching come quelli precedentemente
descritti e la funzione postata (presa dai commenti) dovresti aver
risolto tutti i tuoi problemi.
-- 
I am what I am, I do what I can


 risolto tutti i tuoi problemi.
Ma la funzione postata mi salva in un file di output la miniatura 
dell'immagine originale, giusto?
Ciao,
Mattia

 dell'immagine originale, giusto?
Si, comunque puoi modificarla a piacere.
