Script php: Resize immagini a dimensione fissa o proporzionale
difficoltà:

Download
Script simili
11/12/2006
Questa classe php permette il resize di immagini jpeg, gif e png. La classe permette di settare l'url del file da ridimensionare, la cartella di destinazione, l'altezza e la larghezza del nuovo file.
Spesso pero' capita di dover ridimensionare file di diversa dimensione, per cui una dimensione fissa dei lati dell'immagine potrebbe portare a un' immagine stretchiata, che non mantiene le proporzioni e quindi deformata.
Si possono quindi decidere se ridimensionare l'immagine a una dimensione fissa o meno. Nel secondo caso si puo' decidere se mantenere fisse la base e calcolare in modo proporzionale l'altezza o viceversa. Infine si può anche decidere di non tenere fissa nè la base nè l'altezza ma calcolare in modo automatico quale tenere fisso affinchè l'immagine rientri in uno spazio massimo indicato da altezza e larghezza.
L'utilizzo della classe è piuttosto semplice. L'esempio base prevede il solo passaggio della variabile indicante la posizione del file da ridimensionare:
<?La classe ridimensionerà l'immagine e ne creerà una copia ridimensionata nella cartella di default. Con le impostazioni di default.
include("classe_resize.php");
$resize = new resize;
$resize->urlimage = "folder/immagine.jpg";
$resize->go();
?>
Possiamo personalizzare il risultato settando alcune variabili. Se non valorizzate saranno presi i valori di default.
$resize->urlimage = "folder/immagine.jpg";urlimage : Obbligatorio, indica il percorso dell'immagine da ridimensionare
$resize->fisso = 1;fisso : Indica se il resize deve essere fatto in modo fisso o proporzionale. Se il valore è 1 (default) l'immagine finale avrà dimensioni fisse, quindi il risultato potrebbe essere un'immagine distorta, se il valore è 0 l'immagine sarà ridimensionata in modo da mantenere le proporzioni tra i lati.
$resize->latofisso = "X";latofisso : Nel caso la variabile fisso sia uguale a 0 e quindi il resize avviene in modo proporzionale, tramite questa variabile si puo' decidere quale lato sia quello fisso e quale quello variabile. I valori che puo' assumere sono "X", "Y" e "XY". Nel primo caso la base avrà dimensione fissa (uguale al valore assegnato nella variabile maxX, mentre l'altezza sarà calcolata in modo variabile. Nel secondo caso avverrà il contrario. Nel terzo caso verrà deciso in automatico dal sistema quale lato tenere uguale alla variabile maxX o maxY in modo tale che l'immagine non esca dalla spazio contrassegnato dal rettangolo con base maxX e altezza maxY.
$resize->maxX = 200;maxX : Indica la larghezza dell'immagine in pixel. Valore di default 100.
$resize->maxY = 300;maxY : Indica l'altezza dell'immagine in pixel. Valore di default 100.
$resize->folder = "public/";folder : Indica la cartella di destinazione dell'immagine ridimensionata. Default è "public/"
$resize->newName = "nuova.jpg";newName : indica il nome dell'immagine ridimensionata. Deve essere un file in formato jpeg. Se lasciato vuoto il sistema darà lo stesso nome dell'immagine originale.
A operazione avvenuta verranno restituiti un array contenente gli errori (errore), l'estensione del file caricato(Estensione) e il suo nome(originalName), l'altezza(originalX) e larghezza(originalY) del file originale, e quelle finali del file ridimensionato(newX e newY).
Vediamo un esempio completo:
<?
include(classe_resize.php);
$resize = new resize;
$resize->urlimage = "folder/immagine.jpg";
$resize->fisso = 0;
$resize->maxX = 200;
$resize->maxY = 100;
$resize->latofisso = "X";
$resize->folder = "public/img/";
$resize->newName = "nuovonome.jpg";
$resize->go();
if(count($resize->errore)==0){
echo "Nome file originale: ".$resize->originalName."<br>";
echo "Altezza file originale: ".$resize->originalY."<br>";
echo "Larghezza file originale: ".$resize->originalX."<br>";
echo "Nuova Altezza: ".$resize->newY."<br>";
echo "Nuova Larghezza: ".$resize->newX."<br>";
}else{
echo implode("<br>", $resize->errore);
}
?>
Per finire ecco la classe completa da includere:
class resize{
var $urlimage = "";
var $maxX = 100;
var $maxY = 100;
var $fisso = 1;
var $latofisso = "XY";
var $folder = "public/";
var $newName = "";
function controlladati(){
$this->errore = array();
$this->Estensione = "";
$this->originalX = 0;
$this->originalY = 0;
$this->originalName = "";
$this->newX = 0;
$this->newY = 0;
if($this->urlimage==""){
array_push($this->errore,"Scegliere un file da ridimensionare");
}elseif(!file_exists($this->urlimage) || !is_file($this->urlimage)){
array_push($this->errore,"Il file selezionato non esiste");
}
if(!is_numeric($this->maxX) || !is_numeric($this->maxY) || $this->maxX<0 || $this->maxY<0){
array_push($this->errore,"L'altezza e la larghezza dell'immagine devono essere numerici");
}
if(!file_exists($this->folder) || !chmod($this->folder,0777)){
array_push($this->errore,"La cartella di destinazione non esiste o non è scrivibile");
}
if($this->fisso!=0 && $this->fisso!=1){
array_push($this->errore,"La variabile di dimensione fissa deve essere 0 o 1");
}
if($this->latofisso!="XY" && $this->latofisso!="X" && $this->latofisso!="Y"){
array_push($this->errore,"La variabile di lato fisso devono essere X o Y o XY");
}
if(count($this->errore)>0){
return false;
}else{
return true;
}
}
function go(){
if($this->controlladati()){
$filename = basename($this->urlimage);
$this->originalName = $filename;
if($this->newName==""){$this->newName=$filename;}
$this->Estensione = strtolower(substr($filename, strrpos($filename, "."), strlen($filename)-strrpos($filename, ".")));
if($this->Estensione==".jpeg" || $this->Estensione==".jpg"){
$handle_immagine = imagecreatefromjpeg($this->urlimage);
}elseif($this->Estensione==".gif"){
$handle_immagine = imagecreatefromgif($this->urlimage);
}elseif($this->Estensione==".png"){
$handle_immagine = imagecreatefrompng($this->urlimage);
}else{
array_push($this->errore,"Formato immagine non valido");
return null;
}
$handle_immagine_adattata=$this->adatta($handle_immagine);
imagejpeg($handle_immagine_adattata, $this->folder.$this->newName, 80);
chmod($this->folder.$this->newName,0777);
unset($handle_immagine);
unset($handle_immagine_adattata);
}
}
function adatta($handle_immagine){
$this->originalX=imagesx($handle_immagine);
$this->originalY=imagesy($handle_immagine);
if($this->fisso==1){
$this->newX=$this->maxX;
$this->newY=$this->maxY;
}else{
if($this->latofisso=="XY"){
if ($this->originalX/$this->originalY>$this->maxX/$this->maxY) {
$this->newX=$this->maxX;
$this->newY=($this->originalY/$this->originalX)*$this->maxX;
} else {
$this->newX=($this->originalX/$this->originalY)*$this->maxY;
$this->newY=$this->maxY;
}
}elseif($this->latofisso=="X"){
$this->newX=$this->maxX;
$this->newY=($this->originalY/$this->originalX)*$this->maxX;
}elseif($this->latofisso=="Y"){
$this->newX=($this->originalX/$this->originalY)*$this->maxY;
$this->newY=$this->maxY;
}else{
if ($this->originalX/$this->originalY>$this->maxX/$this->maxY) {
$this->newX=$this->maxX;
$this->newY=($this->originalY/$this->originalX)*$this->maxX;
} else {
$this->newX=($this->originalX/$this->originalY)*$this->maxY;
$this->newY=$this->maxY;
}
}
}
$tmp_immagine = imagecreatetruecolor($this->newX, $this->newY);
$handle_immagine_adattata = imagecopyresampled($tmp_immagine, $handle_immagine, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
return $tmp_immagine;
}
}
Permalink:
Tag:
Script Simili:
Script asp: Creare pdf dinamicamente con asp senza componenti
Script php: Estrarre e visualizzare immagini casuali da una cartella
Script php: Upload file con filtro estensione e dimensione massima
Script javascript: Galleria fotografica con thumb e pop-up di dimensione immagine
Link utili:
Vota:
Commenti
18/1/2007 16:15:32
Ottimo, funziona perfettamente cosa strana mi è riuscito a primo tentativo.
Adesso mi domando???? se volessi inserirlo in un db mysql insieme ad un testo, quale logica per l'iimagine devo seguire, dato che per i campi di testo ci sono riuscito?
18/1/2007 16:22:34
solitamente le immagini non si inseriscono nel database (a meno di casi molto particolari), al massimo inserisci il nome dell'immagine, o l'url completo a seconda dei casi.
quando poi richiedi i campi di testo richiedi anche il nome dell'immagine e lo inserisci nel tag <img>
1/2/2007 9:55:06
Ciao,
funziona tutto regolarmente in locale. Sul server in linea invece l'errore riportato è questo:
Warning: imagejpeg() [function.imagejpeg]: Unable to open 'xxx/69d0111922/big/69d0111922-4.jpg' for writing in /home/xxx/public_html/xxx/classes/classe_resize.php on line 75
Suggerimenti?!
Grazie
1/2/2007 10:00:17
Devi assicurarti 2 cose: primo che la cartella di destinazione del file abbia i permessi di scrittura. secondo che sul server sian installate librerie GD.
Fai un file con scritto <? phpinfo() ?> e vedi se le librerie GD sono attive.
1/2/2007 10:03:19
GD Support enabled
GD Version bundled (2.0.28 compatible)
FreeType Support enabled
FreeType Linkage with freetype
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
XBM Support enabled
La GD è attiva.
Visto che hai risposto subito cerco di approfondire il problema.
Credo una dir con chmod 0777. Ok
Al suo interno creo due dir: big e thumbs chmod 0777
Ma quando eseguo $resize->go(); non so perché le due dir big e thumb assumono valore chmod 0401.
E quindi l'errore riportato.
1/2/2007 10:07:38
il server è linux o windows con supporto php?
cosa dice la riga 75?
1/2/2007 10:12:11
prova a cambiar questo:
if(!file_exists($this->folder) || !chmod($this->folder,777)){con
if(!file_exists($this->folder) || !chmod($this->folder,0777)){1/2/2007 10:13:39
Server Linux.
Posto un pelo di codice, spero non ti dispiaccia. Se credi che possa 'sporcare' cancella pure.
define("UP_DIR", 'xxx/'.$row['cod_an'].'/');
if (count($_FILES) > 0) {
$nomeFile = $_FILES['img']['name'];
...
if(!is_dir(UP_DIR)) {
mkdir(UP_DIR,0777);
chmod(UP_DIR,0777);
}
...
$resize = new resize;
$resize->maxDim = 1024;
$resize->size = $_FILES['img']['size'];
$resize->fisso = 0;
$resize->newName = "";
...
$newName = $row['cod_an'].'-'.$numeroFoto.$ext;
...
move_uploaded_file( $_FILES['img']['tmp_name'], UP_DIR.$newName);
chmod(UP_DIR.$newName, 0777);
$resize->urlimage = UP_DIR.$newName;
$resize->maxX = 338;
$resize->maxY = 300;
$resize->latofisso = "X";
$resize->folder = UP_DIR.'big/';
//creo la dir big se non esiste
if(!is_dir($resize->folder)) {
mkdir($resize->folder,0777);
chmod($resize->folder,0777);
}
$resize->go();
Alla riga 75:
imagejpeg($handle_immagine_adattata, $this->folder, 80);
chmod($this->folder.$this->newName,0777);
1/2/2007 10:16:38
Che occhio Fabio!
Credo che if(!file_exists($this->folder) || !chmod($this->folder,0777)){
sia stata la mossa giusta. Sembra funzionare a dovere.
Grazie 1000, il tuo aiuto è prezioso.
Daweb
1/2/2007 10:20:01
Perfetto. Infatti avevo letto su php.net che è più sicuro usare il formato 0777. Modifico anche la classe e la ricarico và. Grazie a te x la segnalazione.
1/2/2007 10:29:23
Allora già che ci siamo ancora una cosa.
Tu usi:
unset($handle_immagine);
unset($handle_immagine_adattata);
Io ho modificato con imagedestroy()...
21/2/2007 17:55:21
Innanzitutto complimenti per l'articolo che mi è stato molto utile soprattutto per correggere un mio script che sbagliava il calcolo delle proporzioni.
Lascio questo commento, e mi scuso per non potervi essere di maggiore aiuto, solamente per far notare che non è stata tenuta in considerazione la possibilità che le dimensioni dell'originale siano già inferiori a quelle massime e si abbia impostato ad XY il lato fisso.
12/3/2007 11:50:32
Ottima, solo due piccole pecche..
1- a volte sarebbe utile non eseguire il resize se l'immagine su cui lavorare è di dimensioni inferiori di maxX e maxY
2- non è possibile in nessun modo, quando si lavora su gif e png con trasparenze, evitare il fondo nero?
12/3/2007 11:57:01
La classe crea immagini jpeg, per cui non mantiene le trasparenze. Per tenerle in linea di massima bisognerebbe, a seconda dell'immagine caricata, creare la nuova immagine con 'imagepng' o 'imagegif' invece che con 'imagejpeg'.
12/3/2007 15:29:54
Poteva probabilmente essere fatto meglio, ma ho modificato la classe in modo che funzioni anche con le GIF e ridimensioni solo se l'immagine è di dimensioni superiori a quelle volute..
<?
class resize{
var $urlimage = ""; # percorso dell'immagine su cui lavorare
var $maxX = 100; # larghezza massima in pixel
var $maxY = 100; # altezza massima in pixel
var $fisso = 1; # 1 immagine distorta - 0 mantiene proporzioni
var $latofisso = "XY"; # lato su cui basarsi per calcolo.. se XY viene deciso in automatico per rimanere nel rettangolo X*Y
var $folder = "public/"; # directory di destinazione immagine modificata
var $newName = ""; # nuovo nome dell'immagine
function controlladati(){
$this->errore = array();
$this->Estensione = "";
$this->originalX = 0;
$this->originalY = 0;
$this->originalName = "";
$this->newX = 0;
$this->newY = 0;
if($this->urlimage==""){
array_push($this->errore,"Scegliere un file da ridimensionare");
}elseif(!file_exists($this->urlimage) || !is_file($this->urlimage)){
array_push($this->errore,"Il file selezionato non esiste");
}
if(!is_numeric($this->maxX) || !is_numeric($this->maxY) || $this->maxX<0 || $this->maxY<0){
array_push($this->errore,"L'altezza e la larghezza dell'immagine devono essere numerici");
}
if(!file_exists($this->folder) || !chmod($this->folder,0777)){
array_push($this->errore,"La cartella di destinazione non esiste o non è scrivibile");
}
if($this->fisso!=0 && $this->fisso!=1){
array_push($this->errore,"La variabile di dimensione fissa deve essere 0 o 1");
}
if($this->latofisso!="XY" && $this->latofisso!="X" && $this->latofisso!="Y"){
array_push($this->errore,"La variabile di lato fisso devono essere X o Y o XY");
}
if(count($this->errore)>0){
return false;
}else{
return true;
}
}
function go(){
if($this->controlladati()){
$filename = basename($this->urlimage);
$this->originalName = $filename;
if($this->newName==""){$this->newName=$filename;}
$this->Estensione = strtolower(substr($filename, strrpos($filename, "."), strlen($filename)-strrpos($filename, ".")));
if($this->Estensione==".jpeg" || $this->Estensione==".jpg"){
$handle_immagine = imagecreatefromjpeg($this->urlimage);
}elseif($this->Estensione==".gif"){
$handle_immagine = imagecreatefromgif($this->urlimage);
}elseif($this->Estensione==".png"){
$handle_immagine = imagecreatefrompng($this->urlimage);
}else{
array_push($this->errore,"Formato immagine non valido");
return null;
}
$handle_immagine_adattata=$this->adatta($handle_immagine);
switch($this->Estensione){
default:
case ".jpeg":
case ".jpg":
imagejpeg($handle_immagine_adattata, $this->folder.$this->newName, 80);
break;
case ".gif":
imagegif($handle_immagine_adattata, $this->folder.$this->newName, 80);
case ".png":
imagepng($handle_immagine_adattata, $this->folder.$this->newName, 80);
break;
}
chmod($this->folder.$this->newName,0777);
unset($handle_immagine);
unset($handle_immagine_adattata);
}
}
function adatta($handle_immagine){
$this->originalX=imagesx($handle_immagine);
$this->originalY=imagesy($handle_immagine);
if($this->originalX <= $this->maxX AND $this->originalY <= $this->maxY){
$this->newX=$this->originalX;
$this->newY=$this->originalY;
}
else{
if($this->fisso==1){
$this->newX=$this->maxX;
$this->newY=$this->maxY;
}
else{
if($this->latofisso=="XY"){
if ($this->originalX/$this->originalY>$this->maxX/$this->maxY) {
$this->newX=$this->maxX;
$this->newY=($this->originalY/$this->originalX)*$this->maxX;
}
else {
$this->newX=($this->originalX/$this->originalY)*$this->maxY;
$this->newY=$this->maxY;
}
}
elseif($this->latofisso=="X"){
$this->newX=$this->maxX;
$this->newY=($this->originalY/$this->originalX)*$this->maxX;
}
elseif($this->latofisso=="Y"){
$this->newX=($this->originalX/$this->originalY)*$this->maxY;
$this->newY=$this->maxY;
}
else{
if ($this->originalX/$this->originalY>$this->maxX/$this->maxY) {
$this->newX=$this->maxX;
$this->newY=($this->originalY/$this->originalX)*$this->maxX;
}
else {
$this->newX=($this->originalX/$this->originalY)*$this->maxY;
$this->newY=$this->maxY;
}
}
}
}
$src=@imagecreatefromgif($handle_immagine);
$tpcolor = imagecolorat($src, 0, 0);
$tmp_immagine = imagecreate($this->newX, $this->newY);
imagepalettecopy($tmp_immagine, $src);
imagecopyresized($tmp_immagine, $src, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
$pixel_over_black = imagecolorat($tmp_immagine, 0, 0);
$bg = imagecolorallocate($tmp_immagine, 255, 255, 255);
imagefilledrectangle($tmp_immagine, 0, 0, $this->newX, $this->newY,$bg);
imagecopyresized($tmp_immagine, $src, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
$pixel_over_white = imagecolorat($tmp_immagine, 0, 0);
if($pixel_over_black != $pixel_over_white){
imagefilledrectangle($tmp_immagine, 0, 0, $this->newX, $this->newY, $tpcolor);
imagecopyresized($tmp_immagine, $src, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
imagecolortransparent($tmp_immagine, $tpcolor);
imagegif($tmp_immagine);
}
else
imagegif($tmp_immagine);
$handle_immagine_adattata = imagecopyresampled($tmp_immagine, $handle_immagine, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
return $tmp_immagine;
}
}
?>
12/3/2007 15:31:22
Perdonami Fabio, pensavo che il codice andasse nel tag [code].. Sentiti libero di modificare o cancellare il mio ultimo intervento se pensi che "sporchi" la pagina..
12/3/2007 15:40:39
Grazie per il contributo! Appena ho un attimo ci do un occhio bene!
12/3/2007 16:39:31
Ho testato. Il risultato è corretto, solo che lo script da warning qua e là.
Invece per le gif se sostituiamo semplicemente la terz'ultima riga della classe originale:
$tmp_immagine = imagecreatetruecolor($this->newX, $this->newY);
con:
$tpcolor = imagecolorat($handle_immagine, 0, 0);
$tmp_immagine = imagecreate($this->newX, $this->newY);
imagepalettecopy($tmp_immagine, $handle_immagine);
imagecopyresized($tmp_immagine, $handle_immagine, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
$pixel_over_black = imagecolorat($tmp_immagine, 0, 0);
$bg = imagecolorallocate($tmp_immagine, 255, 255, 255);
imagefilledrectangle($tmp_immagine, 0, 0, $this->newX, $this->newY,$bg);
imagecopyresized($tmp_immagine, $handle_immagine, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
$pixel_over_white = imagecolorat($tmp_immagine, 0, 0);
pare funzionare senza dare errori
20/3/2007 10:52:18
Ho notato che se l'immagine originale è troppo grande mi esce l'errore
Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to allocate 8000 bytes) in /web/htdocs/www.daniele50.it/home/classe_resize.php on line 53
20/3/2007 11:01:59
Eh si...ti consiglio di leggere qua:
Errore immagini grandi con imagecreatefromjpeg
Per immagini troppo grandi in pixel ci sono problemi di allocazione di memoria per imagecreatefromjpeg.
10/5/2007 11:09:12
consiglio...
intanto ottima classe
xò aggiungete in fondo subito dopo return $tmp_immagine;
questo: imagedestroy($tmp_immagine);
serve per liberare la memoria del server
18/5/2007 11:36:46
scusate la mia ignoranza ma come faccio a richiamare lo scrip nel mio codice ogni volta che mi serve cioè se io ho una galleria fotografica e devo creare le minature come faccio devo scrivere ogni volta che mi serve tutto lo script??
18/5/2007 11:59:35
Se scarichi il file da download puoi vedere come fare.
Io includo il file con la classe solo nei file in cui devo fare il resize.
Nell'esempio base per esempio basta fare:
<?
include("classe_resize.php");
$resize = new resize;
$resize->urlimage = "folder/immagine.jpg";
$resize->go();
?>
21/5/2007 14:58:04
Domanda ragazzi: con php4 questo script funziona alla grande!!! ho provato però a metterlo tale cosi in un server con php5 e NON VA NIENTEEEE :(((( come si fa? ma cambiano le classi in php5?
21/5/2007 15:02:52
come nn va niente? se da un errore vediamo cosa dice..
24/5/2007 17:06:22
Innanzi tutto complimenti per lo script veramente fico!!, in locale funziona tutto correttamente ma se lo metto on line mi dice che la cartella di destinazione bla bla...
http://www.24hbusinessonline.com > shopping on line > clicca qui > GIOCATTOLI RADIO CONTROLLATI > modellismo dinamico.php
In questa pagina mi compare il seguente errore:
Warning: chmod() [function.chmod]: Operation not permitted in /mnt/sites/24hbusinessonline.com/web/classe_resize_giochi_dinamici.php on line 30
ma non può essere dato che i permessi alla directory li ho cambiati!?
A qualcun'altro compare lo stesso errore malgrado sia tutto giusto??
ciao a tutti,
Andrea
24/5/2007 17:15:39
Allora in linea di massima le cose possono essere 2:
- la cartella non ha permessi di scrittura, e quindi devi darli prima alle cartelle di destinazione
- controlla di non avere sul server secure_mode attivato. Fai un file con solo:
<? phpinfo() ?>
e vedi se alla voce secure_mode è attivato. In quel caso ci sono un po' di problemi nel dare i permessi alle cartelle. Nel senso che non puoi modificarli da script. In quel caso per prima cosa assicurati che la cartella di destinazione abbia permessi di scrittura, e poi se hai problemi prova a eliminare dalla classe le modifiche a chmod delle cartelle.
24/5/2007 18:53:08
questo è il mio phpinfo, ma il secure_mode non l ho trovato:
http://www.24hbusinessonline.com/phpinfo.php
Ho riletto anche i post inseriti da altri utenti, ma sembrerebbe tutto regolare
ciao e grazie,
andrea
24/5/2007 20:15:30
si..scusa era safe_mode. Cmq è disabilitato. Cancella pure il file.
Cmq è un problema di permessi. Quind controlla che la cartella in cui carichi l'immagine abbia permessi di scrittura.
Per esempio se hai:
$resize->folder = "public/img/";
sia la cartella public che img deve avere permessi scrittura 0777, se no prova con 0755 (modificando da ftp) e se non funza prova a mettere nello script 0755 al posto di 0777.
25/5/2007 12:30:25
ciao... sono all interno delle cartelle ftp dove modifico i permessi... premetto che ho: img/giochi_dinamici/jpg è la cartella dove vengono presi i file e img/giochi_dinamici/re_size è la cartella di destinazione.
Come dici tu applico le modifiche dei permessi alla cartella (root) comprese le sottodirectory.
Impostando 0777 ottengo dei permessi di lettura, scrittura, esecuzione per il proprietario; per il gruppo alcun permesso; per gli altri solo il permesso di lettura. Questa impostazione dei permessi si traduce in 704.
La cosa buffa è che se io imposto alla directory,comprese le sotto cartelle, i permessi 0755 ottengo gli stessi permessi descritti sopra, sia per il proprietario, sia per il gruppo sia per gl'altri. Potresti provare a fare una verifica, se non te anche gli altri utenti....è molto strano cazzo, lo script è paura e in locale funziona tutto correttamente. Questa è la pagina:
http://www.24hbusinessonline.com/giochi_dinamici.php
25/5/2007 12:43:30
1- mi par strano che ti faccia cambiare i permessi della root.Inoltre è pericolo che tutto il sito abbia permessi di scrittura. Controlla che effettivamente applichi i permessi e non dia accesso negato (e che il tuo hosting ti permetta questa modifica)
2- modifica quindi solo i permessi a 'img' per esempio dicendo di applicare le modifiche a sottocartelle e file.
3 - metti permessi 777 a cartella in questione non ceccare alcun permesso ai gruppi, ma tutte le voci sotto.
Ad esempio io ho una schermata tipo:
http://ezcom-fr.com/images/tuto/img2.gif
(software: FlashFXP)
della figura i primi 3 check della prima riga li lascio vuoti e invece riempio gli altri 9 sotto. Permesso numerico 777.
poi ceck all'ultima voce per applicare a sottocartelle.
25/5/2007 12:53:56
mi potresti rispiegare quella cosa del sefe mode. All'interno del del phpinfo ci sono 4 voci:
local value master value
safe_mode off off
safe_mode_exec_dir no value no value
safe_mode_gid off off
safe_mode_include_dir no value no value
quale interessa allo script per poter girare, tutte e quattro? Scrivo al provider..
grazie
4/6/2007 19:41:21
CIAO, QUESTA VOLTA TI SCRIVO PER FARTI I COMPLIMENTI IN MANIERA DEFINITIVA, LO SCRIPT FUNZIONA, FUNZIONA BENE, MA SOPRATTUTTO FUNZIONA ANCHE IN RETE...alla fine era una cazzata, come spesso accade nelle cose, per far si che i file vengano scritti la cartella di destinazione deve avere i permessi settatti su: 733
Grazie per gli sforzi fatti!!
grande
18/10/2007 17:05:15
Sarebbe possibile integrare lo script per ricevere anche file grafici (in entrata) BMP ?
Molto spesso alcuni navigatori caricano immagini appunto in bmp, ma quando viene trattata questa immagine restituisce ovviamente... nulla.
Grazie a tutti Voi
18/10/2007 17:19:35
@ Vitus: credo non sia proprio possibile..
7/12/2007 19:48:17
Ciao Fabio
Grazie per lo script!
Purtroppo però mi dà:
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in classe_resize.php su questa linea:
this->newY=($this->originalY/$this->originalX)*$this->maxX;
come mai?
billi
10/12/2007 15:54:10
Ciao!
Una volta che ho ridimensionato la foto, esiste la possibilità di usare dei filtri per migliorare la qualità dell'immagine?
Sarebbe ad esempio utile aumentare la "precisione" per rendere la foto più nitida.
Grazie tante!
billi
13/12/2007 3:49:20
Forse ho trovato...
Dovrebbe essere questo filtro:
<?php
$image = imagecreatefromjpeg('nathalie.png');
imagefilter($image, IMG_FILTER_MEAN_REMOVAL);
imagejpeg($image, 'img_filter_mean_removal.jpeg');
imagedestroy($image);
?>
Ma nn riesco ad inserirlo nella classe. :(
L'ultimo tentativo m'ha dato questo errore:
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: Unable to access $row[foto35] in /var/www/pagina.php on line 346
Warning: imagecreatefromjpeg($row[foto35]) [function.imagecreatefromjpeg]: failed to open stream: Permission denied in /var/www/pagina.php on line 346
Fatal error: Call to undefined function imagefilter() in /var/www/pagina.php on line 347
Ancora meglio sarebbe inserirlo direttamente in classe_resize.php
Dopo svariati tentativi ed altrettanti fallimenti, mi rivolgo ancora a voi per un aiutino...
Sarebbe possibile?
Grazie mille!!
billi
13/12/2007 9:35:45
Non credo che quella funzione possa aiutarti a migliorare la qualità dell'immagine. Prova sostituire invece nella classe:
imagejpeg($handle_immagine_adattata, $this->folder.$this->newName, 80);
con
imagejpeg($handle_immagine_adattata, $this->folder.$this->newName, 100);
13/12/2007 13:40:49
Ho provato. Grazie mille.
Questo aumenta la qualità giusto?
Ma purtroppo la size è più che il doppio. Ed ogni foto che viene caricata, la ridimensiono in 3 grandezze (height = 35px, 125px, 250px)
Dato che le 35px sono foto piccoline, con IMG_FILTER_MEAN_REMOVAL riuscirei a renderle non di qualità migliore,ma più definite nei contorni.
Ringrazio per la pazienza,
billi
PS: ho fatto un'errore prima nel trascrivere il codice. (nathalie.png).
la foto deve essere naturalmente in formato jpeg e non png, vero?
14/12/2007 15:32:59
Ciao, ho letto un pò tutti i commenti, ma non ho trovato nulla che potesse aiutarmi, il problema è semplice, su hosting linux funziona tutto perfettamente mentre su hosting windows no! mi viene restituito questo errore:
Fatal error: Call to undefined function: imagecreatefromjpeg() in ...\blog\resize\classe_resize.php on line 53
http://www.monacosimone.com/blog/resize/esempio.php
ha questo indirizzo si può provare l'esempio che è possibile scaricare da questo sito!
Sapresti spiegarmi cosa c'è che non va?!? ti ringrazio in anticipo!
Simone
14/12/2007 15:41:21
provato questo:
Devi assicurarti 2 cose: primo che la cartella di destinazione del file abbia i permessi di scrittura. secondo che sul server sian installate librerie GD.
Fai un file con scritto <? phpinfo() ?> e vedi se le librerie GD sono attive.
15/12/2007 1:27:31
Grazie per la risposta, i permessi ci sono il problema sta nel fatto che delle librerie gd non c'è nessuna traccia.... c'è un modo per ovviare al problema che tu sappia?!?
17/12/2007 19:50:55
Ciao raga.
Scusate a me non funge lo script.
Mi dice che la cartella non esiste o non ha i permessi.
Ma quando si parla di permessi si parla di permessi FTP o web...
Grazie
7/1/2008 19:12:18
Scusate la domanda forse cretina.
Ma come ottengo il nome del file senza il percorso? O meglio, come ottengo il nuovo path completo della nuova immagine?
Io fornisco urlimage, folder, lascio newname vuoto e vorrei sapere come arrivare all'immagine salvata. Come faccio?
Magari è così ovvio che non lo vedo!
Grazie, e ottimo lavoro!!
7/1/2008 19:15:39
Scusate ancora.
Carico l'immagine sul server con lo script upload.php, in una dir temporanea, la ridimensiono con classe_resize.php, poi vorrei anche realizzare un'anteprima sempre con classe_resize.php nello stesso script.
Devo caricare la classe prima di ogni chiamata, o basta la prima volta?
Ancora grazie.
7/1/2008 20:21:59
@Paolo:
se non setti tutte le varibili queste prendono i valori di default. nel caso della cartella di destinazione è 'public/'. Per settarla:
<?
include(classe_resize.php);
$resize = new resize;
$resize->urlimage = "folder/immagine.jpg";
$resize->fisso = 0;
$resize->maxX = 200;
$resize->maxY = 100;
$resize->latofisso = "X";
$resize->folder = "public/img/";
$resize->newName = "nuovonome.jpg";
$resize->go();
?>
$resize->folder
è la cartella di destinazione.
L'include della libreria basta che la fai una volta. Poi riparti da:
$resize = new resize;
8/1/2008 20:23:21
@Fabio
Grazie per la risposta. Analizzando meglio il codice della classe, ho trovato quello che cercavo: la funzione PHP basename()... a non saperle le cose!
10/2/2008 17:49:47
avete presente il sito badoo ??
cmq come si fa a prendere una parte di una foto ,es un 80px per 80px senza farla mai sgranare ??..
cioè qualsiasi siano le misure di una foto ,vado a prendere solo una parte,possibilmente dove si trova il viso della persona fotografata..e il tutto in automatico nel momento in cui carichi la foto..
10/2/2008 18:07:24
per far vedere solo una parte di una foto basta inseriral in un div con style="overflow:hidden" la parte in eccesso non verrà visualizzata. Per far vedere una parde decisa a priori è un po' più complicato...dovresti dar modo di dare le coordinate da cui iniziare il ritaglio..e con lo style dare la posizione a partire da quel punto.
10/2/2008 18:18:12
grazie preciso cosi..
un ultima cosa sulla sicurezza chmod..
ji utenti del mio sito quando si registrano, viene creata in autormatico una cartella con id
//creo cartella
@mkdir($_SERVER["DOCUMENT_ROOT"].$id, 0777);
//cambio i diritti
@chmod($_SERVER["DOCUMENT_ROOT"].$id, 0777);
ora quando vojo inserire le proprio foto finiranno nelle proprie cartelle..
secondo te è sicuro fatto in quest modo??
cioè se io ho 5000 utenti. devo creare 5000 cartelle ,il mio dubbio è che sono stroppe ??
10/2/2008 18:46:51
non so quale possa essere la soluzione migliore..ma se pensi che ci saran 5000 utenti e devi solo caricare le foto e nn altri doc potresti semplicemente rinominare la foto con l'userid o con l'id dell'utente cosi sei sicuro che il nome è unico e metti tutto in una cartella.
10/2/2008 18:58:07
ogni utente può caricare molte foto..quindi devono essere ragruppate in una cartella dell utente..
cmq amen ,,vedrò..
grazie mille per lo script
1/3/2008 19:27:32
Ciao Fabio, il tuo script è davvero fantastico, anche perché è proprio quello di cui AVREI bisogno, c'è solo un piccolo problema ma prima di esporlo, ci tengo a precisare che sono un novellino del php.
Funziona tutto benissimo, l'unica cosa è che la
$resize->folder = "public/img/";
non accetta url tipo "http://www.miosito.com/miafolder/" oppure "http://localhost/miafolder/"
oppure "/miafolder/"
Come root, sembra accettare solo c: anche perché ho provato a impostare come resiza folder la seguente stringa:
$resize->folder = "/";
e infatti mi salva il nuovofile.jpg nella cartella "c:\".
Sai dirmi il perché?
Grazie comunque e complimenti per lo script.
Antonio
1/3/2008 19:52:40
prova a usare come folder:
$_SERVER['DOCUMENT_ROOT']."/miafolder/"
se miafolder si trova nella root.
1/3/2008 20:18:20
... che dire...
Grazie 1000!
4/3/2008 12:09:25
ciao fabio ho postato sul sito html un annuncio per uno script per una interfaccia crop image saresti capace di realizzarlo..
http://forum.html.it/forum/showthread.php?s=&threadid=1219554
12/3/2008 2:38:33
Ciao Fabio, uso il tuo script da tempo e va a gonfie vele! Grazie!
Nuova domanda: vorrei non ridimensionare le foto se sono troppo lunghe o alte di proporzioni.
Ho guardato lo script ed ho trovato $this->originalX=imagesx($handle_immagine); e relativa Y.
Come si fa a "testare" le dimensioni prima che l'immagine sia già stata modificata?
Ho fatto vari tentativi, ma la vecchia immagine veniva comunque cancellata.
Grazie tante per l'aiuto!
Billi
13/3/2008 20:45:54
Ciao Fabio,
mi sono gia complimentato con te non solo per l'eccezionale script, ma anche perché è proprio "della mia taglia"... fatto su misura.
Mi succede una cosetta però che non riesco ad aggirare.
Quando faccio l'upload e il resize dell'immagine, il file (sul server di prova quindi in locale) me lo setta in sola lettura. In remoto non ho ancora provato, ma qualora si presentasse lo stesso problema, come si fa a settare in automatico l'attributo in fase di upload?
Mi serve perché, all'operatore, devo dare la possibilità di uoloadare una immagine ma anche di cancellarla.
Grazie anticipatamente,
Antonio
13/3/2008 21:09:11
mi pare strano, infatti nella classe setto il chmod a 0777. Per cui dovrebbe già metterlo con le proprietà giuste. Controlla che la cartella che li contiene abbia i permessi giusti
14/3/2008 0:03:50
è stranissimo infatti...
scusami però... non ti ho detto che i file che carico, li metto in una carte che creo nel seguente modo:
if(!mkdir($nomedir, 0777)) { // creo la cartella
echo "Problemi nella creazione della cartella!" . "<br>";
exit;
}
sbaglio qualcosa?
Grazie e buonanotte.
14/3/2008 15:21:36
Risolto...
in class_resiza, mancava uno "0" a questa stringa:chmod($this->folder.$this->newName,777);
praticamente "0777" invece di "777".
Grazie comunque.
5/4/2008 18:03:18
A Fabio!!! hai una pazienza "terribile" complimenti.
6/4/2008 1:56:18
Salve a tutti.
Complienti per lo script davvero interessante e ben congeniato..solo che smanettando un po con i valori ho notato che nn mi fa il resize sotto i 100px è voluta la cosa o è un puro caso?
9/4/2008 16:59:18
ciao
ho provato la classe e in rete mi da questo problema:
Fatal error: Call to undefined function: imagecreatefromjpeg() in D:\inetpub\webs\codesignstudionet\public\sab\evacommunication\classe_resize\classe_resize.php on line 53
ho visto un post con lo stesso e gli è stato consigliato di verificare se erano attive le librerie GD. l'ho fatto e non ne ho trovato traccia.
è possibile ridolvere il problema o non ci sono speranze?
9/4/2008 17:03:17
se non ci sono le librerie GD2 attive no...
22/4/2008 15:56:43
ciao a tutti...
vorrei alla fine trasformare l'immagine in bianco e nero.
ho inserito:
$handle_immagine_adattata = imagefilter($handle_immagine_adattata, IMG_FILTER_GRAYSCALE);
prima del:
imagejpeg($handle_immagine_adattata, $this->folder.$this->newName, 80);
ma mi dà errore:
Warning: imagejpeg(): supplied argument is not a valid Image resource
come mai? dove sbaglio??
grazie!!!
22/4/2008 20:27:52
Prova ad aggiungere solo:
$tmp_immagine = imagecreatetruecolor($this->newX, $this->newY);
$handle_immagine_adattata = imagecopyresampled($tmp_immagine, $handle_immagine, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
imagefilter($tmp_immagine, IMG_FILTER_GRAYSCALE);
return $tmp_immagine;
23/4/2008 0:36:05
perfetto!!! dal tuo esempio ho capito meglio come funziona imagefilter() e per quel che occorre, che mi è bastato allora semplicemente scrivere:
imagefilter($handle_immagine_adattata, IMG_FILTER_GRAYSCALE);
prima di:
imagejpeg($handle_immagine_adattata, $this->folder.$this->newName, 80);
giusto, no??? mi sembra che funzioni.
grazie!!
24/4/2008 17:24:28
in locale è perfetto.
in rete schermo bianco...!!!
ho provato allora la tua soluzione, ma non so dove inserirla nello script.
24/4/2008 17:31:30
ummm temo ke se la pagina è bianca online non siano installate le librerie GD (vedi altri commenti). Oppure i permessi di scrittura delle cartelle non sono a posto
24/4/2008 18:08:47
phpinfo dice questo:
GD Support enabled
GD Version 2.0 or higher
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.2.1
T1Lib Support enabled
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
i permessi dove li trovo?
però, scusa, se la tua classe mi funziona anche in rete, vuol dire che dovrebbe essere tutto in ordine, no?
24/4/2008 18:42:15
devi settare i permessi di scrittura (via ftp se il tuo client lo permette) a 777. Se sei su aruba non puoi settare permessi in tutte le cartelle ma dovresti avere di default la cartella public coi permessi giusti
25/4/2008 3:44:49
premetto che non so tanto di permessi, però dopo alcuni esperimenti ho trovato che:
i permessi delle cartelle dove cambio le foto sono rwxr-xr-x o rwxrwxrwx.
se nel tuo codice metto 0777, le foto all'interno delle cartelle diventano rwxrwxrwx.
se invece metto 777, diventano r----x--x
in entrambi i modi comunque, se uso il tuo script originale, funziona tutto (inserisco e cancello le foto senza problemi)
appena però scrivo
imagefilter($handle_immagine_adattata, IMG_FILTER_GRAYSCALE);
qualcosa s'incacchia e mi dà la pagina bella bianca.
anche se inserisco il
imagefilter($tmp_immagine, IMG_FILTER_GRAYSCALE);
che mi hai postato prima
25/4/2008 4:56:48
ora ho settato tutte le cartelle, sottocartelle e file a 777.
ma non è cambiato nulla. cos'altro potrebbe essere??
come qualcuno t'ha già scritto... grazie per la pazienza!
12/5/2008 14:22:26
Forse ho capito il problema...è la versione delle libreire GD che è un po' vecchia.
Oppure...che versione di php hai sul server?
imagefilter è supportato solo dalla versio 5 di php.
ps. I permessi van bene 0777. Attento che pero' se hai php 5 con securemode attivo puoi avere problemi lo stesso.
13/5/2008 12:53:48
ho PHP Version 5.2.0-8+etch11
librerie:
GD Support enabled
GD Version 2.0 or higher
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.2.1
T1Lib Support enabled
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
securemode non l'ho trovato e mai toccato e penso che su php5 dovrebbe essere attivo di default.
13/5/2008 14:12:48
safe mode da un po' di problemi con i permessi.
Dai occhio qui:
upload e safe_mode
Per capire pero' qual'è esattamente il tuo problema dovresti pero' attivare la visualizzazione di tutti gli errori, cosi al posto della pagina bianca avremmo il problema..
14/5/2008 5:14:58
mi potresti dire come si fa a modificare la notifica degli errori?
dove devo scrivere:
display_errors = On e
error_reporting = E_ALL ??
14/5/2008 10:05:11
error_reporting(E_ALL);
oppure:
ini_set('error_reporting', E_ALL);
14/5/2008 13:00:32
ho dovuto anche aggiungere
ini_set('display_errors', On);
ok, ora mi dice:
Fatal error: Call to undefined function imagefilter() in....
14/5/2008 14:34:14
Prova a fare una pagina semplice cosi:
<?
ini_set('display_errors', On);
ini_set('error_reporting', E_ALL);
header( "content-type: image/jpg" );
$im = imagecreatefromjpeg('images/background.jpg');
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagejpeg($im);
imagedestroy($im);
?>
A me visualizza correttamente il file in bianco e nero.
Se ti da errore anche qui su imagefilter probabilmente non è attiva sulla tua versione di php. Da ciò che so per le versioni superiori alla 5 non dovresti aver problemi..
però a sto punto...
14/5/2008 14:46:56
Se no prova cosi:
<?
ini_set('display_errors', On);
ini_set('error_reporting', E_ALL);
header( "content-type: image/jpg" );
$im = imagecreatefromjpeg('images/background.jpg');
$sx=imagesx($im);
$sy=imagesy($im);
$filter=imagecreatetruecolor($sx,$sy);
imagecopymergegray($im,$filter,0,0,0,0,$sx,$sy,0);
imagejpeg($im);
imagedestroy($im);
?>
14/5/2008 15:54:39
eh sì, mi dà ancora
Fatal error: Call to undefined function imagefilter()
ho ricontrollato ed ho php5 con le GD enabled
14/5/2008 20:58:27
Per chi fosse interessato al discorso:
Script php: Convertire immagini a colori in bianco e nero
13/6/2008 16:40:22
Se a caricare sn le .bmp come fare per fare il resize di quelle foto?
17/7/2008 12:00:02
Perfetto!
12/9/2008 20:15:37
Complimentissimi Fabio! Script meraviglioso, il migliore in circolazione! Al primo colpo funziona benissimo!
L'unico problema è che se decido di spostare il file che funziona perfettamente in una sottocartella, tipo gestioneimmagini, per comodità e sicurezza (visto che la sottocartella è protetta) mi da' errore, appare a video la dicitura "Il file selezionato non esiste" e "La cartella di destinazione non esiste o non è scrivibile". Ovviamente aggiorno tutti i riferimenti e per sicurezza uso un unico file che fa tutto, ma non va. Funziona solo se lo tengo nella root. E' normale? Ed è sicuro lasciarlo lì visibile a tutti?
Grazie ragazzi!
12/9/2008 20:31:43
@Domenico:
in realtà dovrebbe(io lo uso cosi) funzionare anche caricando file in sottocartelle. E' chiaro che la sottocartella deve avere i permessi corretti per far scrivere il file.
$resize->folder = "public/";
oppure:
$resize->folder = "public/gestioneimmagini/";
cmq nella classe: c'è:
if(!file_exists($this->folder) || !chmod($this->folder,0777)){
array_push($this->errore,"La cartella di destinazione non esiste o non è scrivibile");
}
per cui puoi provare a togliere || !chmod($this->folder,0777)
13/9/2008 12:59:25
Caro Fabio, mi sono spiegato malissimo, scusa.
In realtà anch'io uso le sottocartelle dove inserire le immagini e lo script funziona perfettamente!
Il problema si presenta quando sposto il file .php dello script dalla root ad una sottocartella.
Esempio (senza include perché faccio fare tutto ad un solo file):
Io ho il file in www.miosito.it/script.php
che funziona benissimo.
Se il file lo inserisco in:
www.miosito.it/redazione/gestione-immagini/script.php
iniziano i problemi. Anche naturalmente aggiornato i link alla cartella immagini che si trova nella root. Link che funzionano perché con lo stesso file richiamo le immagini di quella cartella e le vedo perfettamente.
Spero di essermi spiegato meglio adesso... grazie mille!
13/9/2008 13:20:05
allora puo' essere che non trovi il percorso della cartella a partire dalla sotto cartella..
prova a modificare il percorso della cartella
13/9/2008 13:37:50
Niente, non va. Può dipendere dal fatto che la cartella "redazione" è protetta da password?
13/9/2008 16:26:03
Ho deciso di lasciare lo script nella posizione in cui funziona, cioè la ROOT. Per richiamarlo però, utilizzo una variabile $immagine, passata tramite un url, quindi dinamica. Non riesco a sostituire i valori statici di urlimage in $immagine. Come mai? Non riesco a far "vedere" il nome della variabile (dichiarata a inizio pagina) all'interno della classe. Come faccio a dichiarare la variabile globale?
Posto il mio codice per chiarezza:
[code]
//dichiaro la variabile
$immagine=$_GET['immagine'];
//inizio classe
class resize{
global $immagine;
var $urlimage = "miacartella/".$immagine;
var $maxX = 80;
var $maxY = 100;
var $fisso = 0;
var $latofisso = "X";
//eccetera...
[/code]
3/10/2008 17:38:02
a me non funziona se utilizzo i due file php scaricati senza modifiche.
qualcuno può aiutarmi?
nino
3/10/2008 20:42:12
@nino:
E' un po' vago non va.. ti da qualche errore?
Prova a leggere anke i commenti degli altri utenti..
trovi le soluzioni ai problemi + comuni
(x lo + son problemi relativi a configurazione componenti etc)
4/10/2008 18:41:32
se punto sul file classe_resize.php non dà alcun errore;
se apro la cartella img dove mi aspetto la miniatura non c'è;
ho verificato sia i permessi delle cartelle che la disponibilità della libreria GD.
I due file php e le due cartelle li ho inseriti in un'altra cartella, il tutto l'ho spostato sul server , ovviamente nei percorsi ho aggiunto il nome di questa cartella.
Sinceramente non ho ben capito se la miniatura verrà creata automaticamente ,o solo dopo aver puntato sul classe_resize.php.
grazie
10/4/2009 18:06:21
ma con le immagini memorizzate in un database non funziona?
io ho le immagini inviate in attach dagli utenti e memorizzate
in un database mysql e richiamabili con :
attachment.php?attachmentid=399
14/4/2009 12:56:24
@Reck:
beh dovrai prima fare la query che ti trova il nome del file e con il percorso passarlo poi a
$resize->urlimage
17/9/2009 17:39:36
Salve a tutti, ho dei problemi.
Inizialmente andava in locale ma non sul server per via di permessi di scrittura, poi i permessi sono stati cambiati ed ora scrive sul server ma non ridimensiona.
Ho seguito tutti i consigli detti qua, ma continua a non andare sul server ed in più non in locale mi cambia i colori. :D
potete vedere un esempio all'indirizzo:
http://test.laguidaweb.com/gabriele/vetrina/
esce sempre l'errore che non si può scrivere, ma scrive sia nelle cartelle che nel db.
la classe è questa:
<?
class resize{
var $urlimage = "";
var $maxX = 100;
var $maxY = 100;
var $fisso = 1;
var $latofisso = "XY";
var $folder = "public/";
var $newName = "";
function controlladati(){
$this->errore = array();
$this->Estensione = "";
$this->originalX = 0;
$this->originalY = 0;
$this->originalName = "";
$this->newX = 0;
$this->newY = 0;
if($this->urlimage==""){
array_push($this->errore,"Scegliere un file da ridimensionare");
}elseif(!file_exists($this->urlimage) || !is_file($this->urlimage)){
array_push($this->errore,"Il file selezionato non esiste");
}
if(!is_numeric($this->maxX) || !is_numeric($this->maxY) || $this->maxX<0 || $this->maxY<0){
array_push($this->errore,"L'altezza e la larghezza dell'immagine devono essere numerici");
}
if(!file_exists($this->folder) || !chmod($this->folder,0777)){
array_push($this->errore,"La cartella di destinazione non esiste o non è scrivibile");
}
if($this->fisso!=0 && $this->fisso!=1){
array_push($this->errore,"La variabile di dimensione fissa deve essere 0 o 1");
}
if($this->latofisso!="XY" && $this->latofisso!="X" && $this->latofisso!="Y"){
array_push($this->errore,"La variabile di lato fisso devono essere X o Y o XY");
}
if(count($this->errore)>0){
return false;
}else{
return true;
}
}
function go(){
if($this->controlladati()){
$filename = basename($this->urlimage);
$this->originalName = $filename;
if($this->newName==""){$this->newName=$filename;}
$this->Estensione = strtolower(substr($filename, strrpos($filename, "."), strlen($filename)-strrpos($filename, ".")));
if($this->Estensione==".jpeg" || $this->Estensione==".jpg"){
$handle_immagine = imagecreatefromjpeg($this->urlimage);
}elseif($this->Estensione==".gif"){
$handle_immagine = imagecreatefromgif($this->urlimage);
}elseif($this->Estensione==".png"){
$handle_immagine = imagecreatefrompng($this->urlimage);
}else{
array_push($this->errore,"Formato immagine non valido");
return null;
}
$handle_immagine_adattata=$this->adatta($handle_immagine);
imagejpeg($handle_immagine_adattata, $this->folder.$this->newName, 80);
chmod($this->folder.$this->newName,0777);
unset($handle_immagine);
unset($handle_immagine_adattata);
}
}
function adatta($handle_immagine){
$this->originalX=imagesx($handle_immagine);
$this->originalY=imagesy($handle_immagine);
if($this->fisso==1){
$this->newX=$this->maxX;
$this->newY=$this->maxY;
}else{
if($this->latofisso=="XY"){
if ($this->originalX/$this->originalY>$this->maxX/$this->maxY) {
$this->newX=$this->maxX;
$this->newY=($this->originalY/$this->originalX)*$this->maxX;
} else {
$this->newX=($this->originalX/$this->originalY)*$this->maxY;
$this->newY=$this->maxY;
}
}elseif($this->latofisso=="X"){
$this->newX=$this->maxX;
$this->newY=($this->originalY/$this->originalX)*$this->maxX;
}elseif($this->latofisso=="Y"){
$this->newX=($this->originalX/$this->originalY)*$this->maxY;
$this->newY=$this->maxY;
}else{
if ($this->originalX/$this->originalY>$this->maxX/$this->maxY) {
$this->newX=$this->maxX;
$this->newY=($this->originalY/$this->originalX)*$this->maxX;
} else {
$this->newX=($this->originalX/$this->originalY)*$this->maxY;
$this->newY=$this->maxY;
}
}
}
$tpcolor = imagecolorat($handle_immagine, 0, 0);
$tmp_immagine = imagecreate($this->newX, $this->newY);
imagepalettecopy($tmp_immagine, $handle_immagine);
imagecopyresized($tmp_immagine, $handle_immagine, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
$pixel_over_black = imagecolorat($tmp_immagine, 0, 0);
$bg = imagecolorallocate($tmp_immagine, 255, 255, 255);
imagefilledrectangle($tmp_immagine, 0, 0, $this->newX, $this->newY,$bg);
imagecopyresized($tmp_immagine, $handle_immagine, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
$pixel_over_white = imagecolorat($tmp_immagine, 0, 0);
$handle_immagine_adattata = imagecopyresampled($tmp_immagine, $handle_immagine, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
return $tmp_immagine;
}
}
?>
[/code]
e la pagina dove l'ho inserita è questa:
[code]
<?
session_start();
$lang=$_SESSION['lang'];
include("common.php");
define("PAGE_ID", 1);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<title><?= $_SERVER['SERVER_NAME'] ?> - <?=_("Registrazione")?></title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="style.css" type="text/css" />
<script type="text/javascript" src="../libs/my.js"></script>
</head>
<body>
<div id="contenitore">
<div class="header">
<? include("../header.php"); ?>
</div>
<div class="contenuto">
<div class="pagina">
<?
?>
<script type="text/javascript">
<!--
function pag_succ() {
document.getElementById('inserimento').submit();
}
//-->
</script>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<div class="cont_page">
<!-- <div class="title_page_green">
Inserisci Azienda
</div> -->
<div class="form_gestione_green">
<table cellspacing="0" cellpadding="0" border="0" class="steps">
<tr>
<td class="scheda_h">
<br /><?=_("Inserimento vetrina")?>
</td>
</tr>
</table>
<table cellspacing="0" cellpadding="0" border="0" class="steps">
<tr>
<td class="scheda_h">
<br /><?=_("Logo")?>
</td>
<td class="scheda_l">
<br /><?=_("Titolo")?>
</td>
<td class="scheda_l">
<br /><?=_("Descrizione")?>
</td>
<td class="scheda_l">
<br /><?=_("Informazioni")?>
</td>
<td class="scheda_l">
<br /><?=_("Mappa")?>
</td>
<td class="scheda_l">
<br /><?=_("Sito")?>
</td>
<td class="scheda_l">
<br /><?=_("Gallery")?>
</td>
<td class="scheda_l">
<br /><?=_("Template")?>
</td>
<td class="scheda_l">
<br /><?=_("Conferma")?>
</td>
</tr>
</table>
<form action="" method="post" enctype="multipart/form-data" name="form1">
<table align="center">
<tr valign="baseline">
<td nowrap align="right">Logo</td>
<td> <input name="userfile" type="file" id="foto"></td>
</tr>
<tr valign="baseline">
<td nowrap align="right"> </td>
<td><input type="submit" value="Inserisci Foto"></td>
</tr>
</table>
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
<?
$insertSQL = "INSERT INTO photo_company (id_company, date_ins) VALUES ('12', NOW())";
//preparo la stringa per l'inserimento
$Result1 = mysql_query($insertSQL) or die(mysql_error());
//effettuo l'inserimento sul database
$ultimo_id=mysql_insert_id();
//valore di foto_id dopo l'inserimento
$_SESSION['ultimo_id']=$ultimo_id;
$file_temp=($_FILES['userfile']['tmp_name']);
//file temporaneo che contiene l'immagine caricata
$percorso="./tempfoto/";
//cartella sul server dove verrà spostata la foto
$nuovo_nome=$percorso.$ultimo_id.".jpg";
//nuovo nome dell'immagine
$_SESSION['foto']=$ultimo_id.".jpg";
$inviato=file_exists($file_temp);
//verifica se il file è stato caricato sul server
if ($inviato) {
move_uploaded_file($file_temp,$nuovo_nome);
// header("Location:VisualizzaFoto.php");
// sposto l'immagine nella cartella e vado
// alla pagina di visualizzazione
} else {
// header("Location:Errore.php");
// vado alla pagina di errore
}
include("./classe_resize.php");
$resize = new resize;
$resize->urlimage = $nuovo_nome;
$resize->fisso = 0;
$resize->maxX = 200;
$resize->maxY = 100;
$resize->latofisso = "X";
$resize->folder = "./tempfoto/";
$resize->newName = $ultimo_id.".jpg";
$resize->go();
if(count($resize->errore)!=0){
echo implode("<br>", $resize->errore);
}else{
echo "Nome file originale: ".$resize->originalName."<br>";
echo "Altezza file originale: ".$resize->originalY."<br>";
echo "Larghezza file originale: ".$resize->originalX."<br>";
echo "Nuova Altezza: ".$resize->newY."<br>";
echo "Nuova Larghezza: ".$resize->newX."<br>";
}
print "<img src=' ./tempfoto/".$_SESSION['foto']."'> " ;
?>
</table>
</form>
</td>
</tr>
</div>
</div>
</table>
</td>
<td>
<table border="0">
<a href="./index2.php"><input id="action" type="submit" name="action" value="<?=_("Conferma")?> »" class="btn_suspend"/> </a>
</table>
</td>
</tr>
</form>
</table>
</div>
</div>
<div class="footer">
<? include("./footer.php"); ?>
</div>
</div>
</body>
</html>
scusate per il post kilometrico, spero che qualche anima pia abbia la pazienza di aiutarmi.
19/11/2009 1:09:15
Ho modificato la funzione per ridimensionare anche le png e gif (lo script di Davide non funzionava sul mio server)
function go(){
if($this->controlladati()){
$filename = basename($this->urlimage);
$this->originalName = $filename;
if($this->newName==""){$this->newName=$filename;}
$this->Estensione = strtolower(substr($filename, strrpos($filename, "."), strlen($filename)-strrpos($filename, ".")));
if($this->Estensione==".jpeg" || $this->Estensione==".jpg"){
$handle_immagine = imagecreatefromjpeg($this->urlimage);
}elseif($this->Estensione==".gif"){
$handle_immagine = imagecreatefromgif($this->urlimage);
}elseif($this->Estensione==".png"){
$handle_immagine = imagecreatefrompng($this->urlimage);
}else{
array_push($this->errore,"Formato immagine non valido");
return null;
}
$handle_immagine_adattata=$this->adatta($handle_immagine);
switch($this->Estensione){
case ".jpeg":
case ".jpg":
imagejpeg($handle_immagine_adattata, $this->folder.$this->newName, 80);
break;
case ".gif":
imagegif($handle_immagine_adattata, $this->folder.$this->newName);
break;
case ".png":
imagepng($handle_immagine_adattata, $this->folder.$this->newName, 0);
break;
}
chmod($this->folder.$this->newName,0777);
unset($handle_immagine);
unset($handle_immagine_adattata);
}
}
29/4/2010 19:06:26
Sto provando la classe, funziona bene, solo che non capisco perchè con alcune immagini mi dice:
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: '../file_personale/432010185534778683.jpg' is not a valid JPEG file in /var/www/vhosts/dominio.it/httpdocs/core/classe_resize.php on line 53
Avete consigli in merito?
Grazie
7/5/2010 19:54:02
C'è una soluzione per poter usare il tutto con un'immagine caricata con un Form?
Grazie
23/6/2010 15:35:51
Ciao! complimenti per lo script!
Funziona tutto benissimo nel server altervista su cui ho fatto qualche prova ma quando ho caricato il mio sito su un altro server con "PHP Version 5.2.4-2ubuntu5.10" non mi ridimensiona più le immagini.
Ho controllato che ci siano le librerie gd e ho settato i permessi delle cartelle a 777 (ho provato anche 733 o 755 come consigliava qualcuno) ma lo script continua a non funzionare..
quando lo script restituisce un errore è possibile vedere di che tipo di errore si tratta? così provo a saltarci fuori..grazie 1000!
23/6/2010 15:39:33
$resize->errore
non ti restituisce nulla?
se no prova a settare sopra tutto:
error_reporting(E_ALL ^ E_DEPRECATED | E_STRICT);
ini_set('display_errors', true);
23/6/2010 15:52:31
Ti ringrazio per la risposta celere!!
L'errore è il seguente..
ho messo i puntini per non fare vedere il sito e le cartelle..
Warning: chmod() [function.chmod]: Operation not permitted in /var/www/vhosts/.../httpdocs/club/..../...../resize.php on line 30
Warning: Cannot modify header information - headers already sent by (output started at /var/www/vhosts/.../httpdocs/.../.../.../resize.php:30) in /var/www/vhosts/....../httpdocs/club/img_upload.php on line 122
mi da l'errore nella riga:
if(!file_exists($this->folder) || chmod($this->folder,0777)){
qualche suggerimento?
ho controllato più e più volte i permessi delle cartelle..è un po che mi sto scervellando :-(
23/6/2010 15:58:31
prova a commentare tutto quell' if.
dovrebbe andare lo stesso tutto.
per l'header già mandati invece puoi mettere in alto ob_start(). anche se non è il massimo..
23/6/2010 16:13:38
Ok!! Adesso mi ridimensiona le immagini!
C'è ancora qulache errore per quanto riguarda il caricamento di GIF (le carica, le ridimensiona ma da diversi errori) e qualche altra cosina che spero di riuscire a mettere aposto!
Ti ringrazio molto!!
se passi per bologna avanzi una birra!:-)
19/7/2010 17:07:56
GRANDISSIMO!!!!! perfetto....bravo

Feed Rss
1/1/2007 21:28:15
Meravigliosa....pappa pronta!
Complimenti..free script merita di essere sostenuto.