Script php: Resize immagini a dimensione fissa o proporzionale

   difficoltà:  script script script script script

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:

<?
include("classe_resize.php");

$resize = new resize;
$resize->urlimage = "folder/immagine.jpg";
$resize->go();
?>
La classe ridimensionerà l'immagine e ne creerà una copia ridimensionata nella cartella di default. Con le impostazioni di default.
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;

}

}





Commenti


  pierre

1/1/2007 21:28:15

Meravigliosa....pappa pronta!
Complimenti..free script merita di essere sostenuto.

  Giovanni

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?

  Fabio

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>

  daweb

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

  Fabio

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.

  daweb

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.


  Fabio

1/2/2007 10:07:38

il server è linux o windows con supporto php?
cosa dice la riga 75?

  Fabio

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)){


  daweb

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);


  daweb

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

  Fabio

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.

  daweb

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()...

  Michele

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.

  Davide

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?

  Fabio

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'.

  Davide

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;
}

}
?>


  Davide

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..

  Fabio

12/3/2007 15:40:39

Grazie per il contributo! Appena ho un attimo ci do un occhio bene!

  Fabio

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

  daniele50

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

  Fabio

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.

  mesk8

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

  lorenzo

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??

  Fabio

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();
?>


  Matteo

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?

  Fabio

21/5/2007 15:02:52

come nn va niente? se da un errore vediamo cosa dice..

  andrea

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

  Fabio

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.

  andrea

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

  Fabio

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.

  andrea

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

  Fabio

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.

  andrea

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

  Fabio

25/5/2007 14:45:11

Safe_mode limita alcune funzioni. Per maggiori info guarda qui:

safe mode

Comunque le tue impostazioni mi paion corrette.

  andrea

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

  Vitus

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

  Fabio

18/10/2007 17:19:35

@ Vitus: credo non sia proprio possibile..

  billi

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





  billi

7/12/2007 20:29:10

chiedo perdono!
ho sbagliato nel trascivere la classe...
scusa,
billi

  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

  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

  Fabio

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);

  billi

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?

  Simone

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


  Fabio

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.

  simone

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?!?

  Lilli

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

  Paolo

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!!

  Paolo

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.

  Fabio

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;

  Paolo

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!

  merha

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..

  Fabio

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.

  merha

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 ??

  Fabio

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.

  merha

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

  Antonio

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

  Fabio

1/3/2008 19:52:40

prova a usare come folder:
$_SERVER['DOCUMENT_ROOT']."/miafolder/"

se miafolder si trova nella root.


  Antonio

1/3/2008 20:18:20

... che dire...
Grazie 1000!

  merha

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



  Billi

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

  ANTONIO

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

  Fabio

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

  Antonio

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.

  ANTONIO

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.


  Cosimo

5/4/2008 18:03:18

A Fabio!!! hai una pazienza "terribile" complimenti.


  Re_furbo

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?

  sabrina

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?


  Fabio

9/4/2008 17:03:17

se non ci sono le librerie GD2 attive no...

  matteo

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!!!

  Fabio

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;


  matteo

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!!

  matteo

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.

  Fabio

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

  matteo

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?

  Fabio

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

  matteo

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

  matteo

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!

  matteo

12/5/2008 13:48:28

non sono ancora riuscito a risolvere il problema

  Fabio

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.

  matteo

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.


  Fabio

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..

  matteo

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 ??



  Fabio

14/5/2008 10:05:11

error_reporting(E_ALL);

oppure:

ini_set('error_reporting', E_ALL);

  matteo

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....

  Fabio

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...

  Fabio

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);
?>


  matteo

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

  Fabio

14/5/2008 20:58:27

Per chi fosse interessato al discorso:
Script php: Convertire immagini a colori in bianco e nero

  Domenico

13/6/2008 16:40:22

Se a caricare sn le .bmp come fare per fare il resize di quelle foto?

  Sensei

17/7/2008 12:00:02

Perfetto!


  Domenico

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!

  Fabio

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)




  Domenico

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!

  Fabio

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

  Domenico

13/9/2008 13:37:50

Niente, non va. Può dipendere dal fatto che la cartella "redazione" è protetta da password?

  Domenico

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]

  nino

3/10/2008 17:38:02

a me non funziona se utilizzo i due file php scaricati senza modifiche.
qualcuno può aiutarmi?

nino

  Fabio

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)

  nino

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

  Reck

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



  Fabio

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

  Gabriele

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">&nbsp;</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")?> &#187;" 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.


  Mino

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);
}
}


  Roberto

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

  Marco

7/5/2010 19:54:02

C'è una soluzione per poter usare il tutto con un'immagine caricata con un Form?
Grazie

  brando

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!

  Fabio

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);


  brando

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 :-(


  Fabio

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..

  brando

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!:-)


  Layerzero

19/7/2010 17:07:56

GRANDISSIMO!!!!! perfetto....bravo

  Livio

1/8/2010 19:17:28

Ciao, innanzitutto complimentissimi per la tua pazienza e per il tuo lavoro. Ho un problema molto strano, in pratica avevo integrato il tuo script in joomla con un lettore feed xml che automaticamente riceveva l'url dell'immagine, la ridimensionava e la salvava sullo spazio web in aruba. All'inizio funzionava perfettamente, dopo circa 2-3 mesi invece delle immagini adesso mi ritrovo delle immagini completamente nere.

Stranamente lo script non mi restituisce nessun errore.

Suggerimenti ?

  Luca

27/11/2010 14:18:23

Ciao Fabio,
aggiungo alla lista anche i miei complimenti per classe.
Per necessità mi sono permesso di implementarne una parte in modo che possa effettuare anche un taglio dell'immagine senza strech.

Basta impostare $resize->fisso = 2;

Ecco la classe modificata:


<?
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;
//------------------------------//
$this->pointX = 0;
$this->pointY = 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 && $this->fisso!=2){
array_push($this->errore,"La variabile di dimensione fissa deve essere 0, 1 o 2");
}
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;
}elseif(($this->fisso==2)){
//-----------------------------------------//
$this->newX=$this->maxX;
$this->newY=$this->maxY;
if($this->originalX < $this->originalY){
$this->pointY=($this->originalY-$this->originalX)/2;
$this->originalY=$this->originalY - ($this->pointY*2);
}
if($this->originalX > $this->originalY){
$this->pointX=($this->originalX-$this->originalY)/2;
$this->originalX=$this->originalX - ($this->pointX*2);
}
//-----------------------------------------//
}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, $this->pointX, $this->pointY, $this->newX, $this->newY, $this->originalX, $this->originalY);
return $tmp_immagine;
}
}
?>


  Pamela

3/2/2011 21:47:08

Io ho intregrato il tuo script nel mio cms, ma ho dei problemi con le foto ad alta risoluzione. Le foto vengono proprio "storpiate" per quanto riguarda la risoluzione.
Sbaglio qualcosa, oppure lo script non prevede l'utilizzo di foto troppo grandi? es:6 MG 4752x3168 px
Ti ringrazio anticipatamente per la risposta. :-)

  Giovanni Mudadu

1/3/2011 19:43:52

Ciao, ho notato che le foto caricate perdono un po' di qualità. Come posso variare il parametro e fare in modo che se carico un JPG 100, ho un JPG 100 ridimensionato?

Grazie a tutti

  Silvia

30/1/2012 19:28:03

Mi scuso ma volevo far funzionare i due script classe_resize.php e esempio.php, ho installato il server wamp ma digitando i comandi per farlo partire (altri script php vanno) mi ripresenta il testo del codice pari pari, non eseguendo nulla....
potete aiutarmi grazie davvero!
Silvia

  marco

3/9/2012 23:29:26

fabio ho un problema coi permessi.
nel momento in cui vado a ridimensionare la foto oltre all'errore della funzione (cioè che la cartella non è scrivibile) mi arriva anche l'errore del sistema che dice
Warning: chmod() [function.chmod]: Operation not permitted in /Users/nomeutente/Sites/upload.php on line 68

purtroppo per te io lavoro con mac, spero tu mi possa aiutare.

la riga 68 recita appunto if(!file_exists($this->folder) || !chmod($this->folder,0777)){

se tolgo il secondo caso tutto va liscio ma il file non me lo ridimensiona nella cartella selezionata.

ps i permessi per la cartella sembrano essere perfetti :l


  marco

3/9/2012 23:34:52

niente sono riuscito a risolvere dalle impostazioni sui permessi, eliminando comunque quel comando sul codice perchè il mio mac non lo interpretava correttamente essendo diverso il chmod mac rispetto a windows!

  mario

14/3/2013 1:49:08

Ciao! Ho cercato 1 oretta prima di trovare questo che funziona egregiamente ma io ho bisogno di utilizzare le immagini presenti sul web.. utilizzando $_GET non funziona..

$img = $_GET['url'];

$resize = new resize;
$resize->urlimage = $img;

qualche suggerimento?

  BluBaron

10/2/2014 20:14:08

Ciao Fabio,
il tuo script sembra interessante ma detto da uno che ci capisce poco, vale niente.
Sono interessato a quanto hai fatto perchè vorrei dare la possibilità agli utenti di un forum (smf) di poter caricare le proprie immagini e per questo avrei bisogno di un codice che faccia l'upload e poi, se necessario, faccia il resize e rinomini in modo univoco il file caricato (aggiungendo p.e. time al nome ).
Il tutto l'ho ben chiaro come dovrebbe funzionare, il problema è che col php non ci capisco granché.
Potresti indirizzarmi verso una soluzione?



Lascia un commento


Codice di controllo*:
Nome*:
Email/Link:
Testo*:
 
I campi contrassegnati con * sono obbligatori.