View Full Version : [PHP] Resize immagine per ottenere Thumbnail quadrata
Ho creato il seguente codice per ottenere da un'imagine di qualsiasi formato e dimensione una thumbnail quadrata di 120x120px.
Il problema è che il quadrato viene preso partendo da sinistra o dall'alto, mentre a me servirebbe ritagliare la porzione quadrata partendo dal centro.
ESEMPIO:
Immagine: 160x120
Ora mi ritaglia 4pixel da destra, mentre io vorrei far si che ritagli 20 pixel a destra e 20 a sinistra.
EDIT
Devi ritagliare un quadrato 120x120 dalle coordinate
x = (larghezza - 120) / 2
y = (altezza - 120) / 2
Devi ritagliare un quadrato 120x120 dalle coordinate
x = (larghezza - 120) / 2
y = (altezza - 120) / 2
x e y dove dovrei inserirli nel mio codice?
banryu79
01-12-2009, 12:48
x e y dove dovrei inserirli nel mio codice?
Credo nella chiamata a questo metodo:
imagecopyresampled($new_image, $image_source, 0, 0, 0, 0, $crop_w, $crop_h, $orig_w, $orig_h);
la x e la y che cionci ha calcolato rappresentano le coordinate del punto in alto a sinistra (all'interno dell'immagine originale) del quadrato da "ritagliare".
Esattamente. Quella funzione però fa anche altre cose. Non è così immediato adattarla, ci devi lavorare un po' su.
oppure tira giu e modifica jquery uploadify che lavora molto bene e da modificare non è difficile
Non è difficile da modificare questa, serve solo di capire cosa vuole fare in condizioni particolari.
Ad esempio, se l'immagine è più piccola di 120x120 oppure se è ancora interessato alle altre funzionalità che offre la funzione sopra.
nel caso (remoto) in cui l'immagine sia più piccola di 120x120 sarebbe meglio ingrandirla, e successivamente, se non è quadrata, ritagliare le parti di troppo.
Si, non sono un esperto, però so usarlo, solo che ho qualche problema con la funzione "imagecopyresampled" anche guardando sul sito di php non capisco bene il funzionamento.
Ho provato a modificarlo anche inserendo le tue formule però ritaglia male, l'immagine.
La funzione è semplicissima ;)
dst_im
Destination image link resource.
src_im
Source image link resource.
Queste prime due sono immediate.
dst_x
x-coordinate of destination point.
dst_y
y-coordinate of destination point.
Queste due sono le coordinate nell'immagine di destinazione, ovviamente 0,0 in questo caso
src_x
x-coordinate of source point.
src_y
y-coordinate of source point.
Le coordinate nell'immagine sorgente (in caso di coordinata più grande di 120 saranno (coordinata - 120) / 2), altrimenti 0 in caso di ridimensionamento
dst_w
Destination width.
dst_h
Destination height.
Questa è la dimensione nell'immagine di destinazione. 120, 120 nel caso di immagine iniziale più grande.
- 120,s nel caso di immagine con l'altezza minore di 120 e minore della larghezza. Con s = (120 / w) * h
- s, 120 nel caso di immagine con larghezza minore di 120 e minore dell'altezza. Con s = (120 / h) * w
src_w
Source width.
src_h
Source height.
Questa è la dimensione nell'immagine oriiginale.
- 120,120 nel caso di immagine maggiore di 120x120
- la dimensione originale dell'immagine nel caso di una dimensione minore di 120
Grazie per l'aiuto, ho cercato di modificare il codice in base alla tua spiegazione, però l'immagine esce ancora sballata.
Questo è il codice:
$remote_file = "foto/".$_FILES["image_upload_box"]["name"];
imagejpeg($image_source,$remote_file,90);
chmod($remote_file,0644);
$new_w = 120;
$new_h = 120;
$x = 0;
$y = 0;
$orig_w = imagesx($image_source);
$orig_h = imagesy($image_source);
$w_ratio = ($new_w / $orig_w);
$h_ratio = ($new_h / $orig_h);
if ($orig_w > $orig_h ) {
$crop_w = round($orig_w * $h_ratio);
$crop_h = $new_h;
// RITRATTO
} elseif ($orig_w < $orig_h ) {
$crop_h = round($orig_h * $w_ratio);
$crop_w = $new_w;
// QUADRATO
} else {
$crop_w = $new_w;
$crop_h = $new_h;
}
$x = ($crop_w - 120) / 2;
$y = ($crop_h - 120) / 2;
$new_image = imagecreatetruecolor($new_w,$new_h);
$image_source = imagecreatefromjpeg($remote_file);
imagecopyresampled($new_image, $image_source, 0, 0, $x, $y, $crop_w, $crop_h, $orig_w, $orig_h);
imagejpeg($new_image,$remote_file,90);
Sono riuscito a farlo funzionare ora è così:
$remote_file = "foto/".$_FILES["image_upload_box"]["name"];
imagejpeg($image_source,$remote_file,80);
chmod($remote_file,0644);
$new_w = 120;
$new_h = 120;
$orig_w = imagesx($image_source);
$orig_h = imagesy($image_source);
$w_ratio = ($new_w / $orig_w);
$h_ratio = ($new_h / $orig_h);
// PAESAGGIO
if ($orig_w > $orig_h ) {
$crop_w = round($orig_w * $h_ratio);
$crop_h = $new_h;
$x = ($orig_w - $orig_h) / 2;
// RITRATTO
} elseif ($orig_w < $orig_h ) {
$crop_h = round($orig_h * $w_ratio);
$crop_w = $new_w;
$y = ($orig_h - $orig_w) /2;
// QUADRATO
} else {
$crop_w = $new_w;
$crop_h = $new_h;
}
$new_image = imagecreatetruecolor($new_w,$new_h);
$image_source = imagecreatefromjpeg($remote_file);
imagecopyresampled($new_image, $image_source, 0, 0, $x, $y, $crop_w, $crop_h, $orig_w, $orig_h);
imagejpeg($new_image,$remote_file,80);
Però non riesco a capire da dove posso modificare il nome del file caricato...
Qulacuno saprebbe aiutarmi?
Il succo è: sai programmare in PHP o no ? Hai tutti gli elementi per tirare fuori la funzione con pochi piccoli passaggi.
Si, la funzione c'è già tutta e funziona, semplicemente ho postato solo la parte di codice che intendo modificare...
Ora l'unico problema che ho è cambiare il nome dell'immagine che carica l'utente. Per esempio dato che quella che salvo è una miniatura vorrei aggiungere alla fine del nome del file "_thumb" o qualcosa del genere.
Prendi il nome del file, lo splitti con explode usando come delimitatore il punto, concateni al penultimo elemento del vettore la stringa "_thumb" e poi passi tutto ad implode.
Il nome è qui: $remote_file = "foto/".$_FILES["image_upload_box"]["name"];
Anzi, più semplice:
$pos = strrpos($remote_file, '.');
ed ottieni la posizione del punto.
$remote_file = substr($remote_file, 0, $pos) . "_thumb" . substr($remote_file, $pos);
Grazie, provo e ti faccio sapere come va!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.