PDA

View Full Version : [PHP] Resize immagine per ottenere Thumbnail quadrata


Fede 88
29-11-2009, 18:32
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

cionci
30-11-2009, 00:14
Devi ritagliare un quadrato 120x120 dalle coordinate
x = (larghezza - 120) / 2
y = (altezza - 120) / 2

Fede 88
30-11-2009, 18:40
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".

cionci
01-12-2009, 14:32
Esattamente. Quella funzione però fa anche altre cose. Non è così immediato adattarla, ci devi lavorare un po' su.

IAmZak
01-12-2009, 14:55
oppure tira giu e modifica jquery uploadify che lavora molto bene e da modificare non è difficile

cionci
01-12-2009, 14:59
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.

Fede 88
01-12-2009, 16:36
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.

cionci
01-12-2009, 16:40
Ma tu sai usare PHP ?

Fede 88
01-12-2009, 16:42
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.

cionci
01-12-2009, 18:41
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

Fede 88
05-12-2009, 13:43
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);

Fede 88
08-12-2009, 16:36
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...

Fede 88
12-12-2009, 12:49
Qulacuno saprebbe aiutarmi?

cionci
12-12-2009, 13:29
Il succo è: sai programmare in PHP o no ? Hai tutti gli elementi per tirare fuori la funzione con pochi piccoli passaggi.

Fede 88
12-12-2009, 13:55
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.

cionci
12-12-2009, 14:03
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"];

cionci
12-12-2009, 15:23
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);

Fede 88
12-12-2009, 15:36
Grazie, provo e ti faccio sapere come va!