Ridimensionare immagini con PHP

Lunedì 10 Marzo 2008 - 09:55

di Cesare Lamanna

PHP e Open Source

Smart Image Resizer è uno script basato su PHP per il ridimensionamento di immagini creato da Joe Lencioni e pubblicato recentemente sul suo blog.

Stando alle parole dell’autore, l’utilità maggiore consiste nel fatto che consente di caricare una sola volta un’immagine ad alta risoluzione sul sito per poi poterla riutilizzare in svariati contesti nelle dimensioni desiderate. Tutto avviene passando la giusta query string nel contesto dell’attributo src dell’elemento img.

Dunque, posto che abbiamo sul nostro server un’immagine (bean.jpg) che misura 900×600px, definendo così il tag img otterremo una miniatura larga 200px:

<img src="/image.php/coffee-bean.jpg?width=200&height=200&image=/wp-content/uploads/2008/03/coffee-bean.jpg" alt="Coffee Bean" />

Lo script prevede un meccanismo per il salvataggio delle immagini ridimensionate in una directory cache e opera su file .jpg, .gif e .png.

Tags:

Categoria: PHP e Open Source | Permalink

Commenti

1

Probabilmente non fa per me, da quello che ho capito è un resizer che carica sempre l’immagine grande e in base ai parametri passati la riduce.

Però se io dovessi fare una galleria fotografica dove ho una serie di thumbnail, con questo script risulterebbe molto più pesante il caricamento in quanto le miniature sarebbero generate al volo comunque caricando le immagini di destinazione.

Ho capito bene?

# - postato da kall3 - 10 Marzo 2008 - 10:41

2

@kall3

Da quello che ho capito utilizza un sistema di caching interno che salva le immagini create, quindi il rallentamento dovrebbe essere evitato.

Ci sono però due problemi:

  1. chiunque può abbatterti il server mandando semplici richieste get per la creazione delle immagini (magari hanno implementato qualche sistema per evitare il problema)
  2. l’indirizzo dell’immagine diventa pessimo per fare SEO

# - postato da Riot - 10 Marzo 2008 - 11:14

3

Le librerie GD sono un arma a doppio taglio per i problemi di memoria e lasciare un redimensionamento lato pubblico è abbastanza pericoloso come dice Riot.
Al massimo è utile scaricarlo per vedere il codice e riutilizzarlo per altre funzioni :)

# - postato da echat - 10 Marzo 2008 - 11:20

4

Concordo in pieno con Riot. L’idea non è malvagia, ma è carente sotto l’aspetto relativo alla sicurezza e alla motorizzazione. Rimandato

# - postato da paolo - 10 Marzo 2008 - 11:47

5

Mi sono fatto lo stesso identico script tempo fa e funziona molto bene (almeno il mio).
La pagina è più lenta solo la prima volta che un qualsiasi utente la richiede (di solito sono io sviluppatore mentre testo il sito).
Vorrei sottolineare che la cache non è relativa al browser, c’è una cartella che funge da cache, se un australiano visita il mio sito in una pagina mai visitata crea al volo i ridimensionamenti per qualsisasi altro utente vedrà in seguito quella pagina.

# - postato da Grab - 10 Marzo 2008 - 13:03

6

Mi sono dimenticato una parte:
per quanto riguarda riguarda la sicurezza non è il massimo, magari facendo un check sul referer…
Altre idee?

# - postato da Grab - 10 Marzo 2008 - 13:06

7

io mi sono fatto un sistema simile, ma la thumbnail la creo fisicamente in una cartella (con quel sistema di cache) una sola volta quando carico l’immagine grande dal lato gestione.
in questo modo non ho sovraccarichi ogni volta che dal lato pubblico richiamo le immagini.

# - postato da Troglos - 10 Marzo 2008 - 13:16

8

io ieri ho inventato l’acqua calda…

Scusate, ma in genere le notizie di edit sono molto interessanti e di un certo livello, mi sfugge qualcosa o questo script è di una banalità assurda?

# - postato da Giovanni Battista Lenoci - 10 Marzo 2008 - 14:02

9

Ho ripensato ai problemi sulla sicurezza:
basta non far fare il ridimensionamento ad una pagina php (in questo caso image.php) lasciando in chiaro i parametri nel link alla pagina. Lo stesso “lavoro” può farlo un’oggetto o una funzione che ritorna il nome dell’immagine che poi si andrà a stamapre nell’attributo src.

@Troglos:
se ritagli le immagini nel backend 200×200, fai un data entry di 1000 immagini, dopo 2 mesi il cliente le vuole 300×300 cosa fai? Cmq ti servirebbe almeno una procedura che si ripassi tutte le foto.

@Giovanni
A me non sembra banale e, anche se lo fosse, mi sembra un bella idea che penso non sia venuta in mente ad alemno l’80% degli sviluppatori

# - postato da Grab - 10 Marzo 2008 - 14:34

10

Una soluzione che evitera il problema di sicurezza e l’url ‘poco amichevole’ è quella di richiamare una funzione che generi lato server l’indirizzo dell’immagine ridimensionata, creandola nel caso non fosse già stato fatto - utilizzo una cosa simile per la generazione automatica di miniature per gallerie di immagini.
L’unico “inconveniente” è che occorre inserire il codice php con il richiamo alla funzione stessa, ma è comunque più semplice che riscrivere l’url parametrizzato.
L’altro difetto di questi metodi è che l’algoritmo di compressione della libreria php non è certamente all’altezza di quelli utilizzati da Photoshop o simili, quindi ne limiterei l’utilizzo alla generazione di anteprime in bassa risoluzione.

P.S.
qualcosa del tipo:
# - postato da Marco Traverso - 10 Marzo 2008 - 19:09

11

P.S. Ho provato ad inserire il codice, ma non ci sono riuscito…
Ci riprovo un’ultima volta:
< img src= ” < ?php echo resized_image(’/coffee-bean.jpg’,300) ; ? > ” />

# - postato da Marco Traverso - 10 Marzo 2008 - 19:11

12

@Marco
Non so su che siti lavori di solito ma se devo usare photoshop per ogni immagini di prodotto da caricare …
Sono d’accordo che si ha un risultato migliore con photoshop, ma anche le GD danno ottimi risultati.

# - postato da Grab - 10 Marzo 2008 - 19:38

13

stavo per scartare la soluzione quando ho letto alla fine che c’è la possibilità di memorizzare in cache le immagini…

e si, altrimenti ridimensionare per ogni visitarore le immagini sarebbe molto dispendioso di risorse per il server.

# - postato da Francesco - 10 Marzo 2008 - 23:17

14

Dove sarebbe la grande novità ??

# - postato da ringo_mato - 10 Marzo 2008 - 23:31

15

@Grab
Credo che dove le immagini rappresentino un valore aggiunto (siti di fotografia, ma anche immagini di “copertina” per articoli, ecc.) sia meglio privilegiare la qualità - tra l’altro con Photoshop si può automatizzare il processo con le action in batch.

E’ chiaro che se occorre gestire un vasto catalogo di prodotti e/o immagini, oppure consentire all’utente di caricare foto sul server le GD sono la soluzione ottimale.

P.S. Non mi ero accorto che la soluzione della funzione era stata già detta da te nel commento precedente. Scusate la ripetizione!

# - postato da Marco Traverso - 11 Marzo 2008 - 02:08

16

Sinceramente io la penso come ringo e come giovanni, si tratta di aver reinventato l’acqua calda … nulla più.

E, giusto per essere precisi, ci sono un po di follie dentro il codice che permetterebberò di fare un bel (D)DoS a chiunque con facilità!

A riga 235 c’è il bellissimo comando
ini_set('memory_limit', $memoryToAllocate);

dove $memoryToAllocate corrisponde a 100MB.

Gli hosters, per loro fortuna, tengono il safe mode on, di conseguenza questo comando cade nel vuoto, ma provate ad immaginare cosa succede se passo il parametro nocache in GET e la stessa immagine, molto grande, e gli dico di ridurmela di un solo pixel per lato … semplicemente implode il server, nulla più :zizi:

Inoltre le GD sono infinitamente lente per ridimensionare immagini di grosse dimensioni, di conseguenza oltre ad un problema di memoria ne spunterebbe uno pure inerente al consumo del processore che resterebbe occupato per svariato tempo

Per completare, poi, alla fine del codice invece di scrivere l’immagine sulla cache e inviare quello lui effettua l’operazione di invio per ben due volte, operazione che comporta la ricreazione on-the-fly del contenuto del file che, anche se non è pesantissima, si fa sicuramente sentire. Il codice è presente da riga 314 a riga 319.

// Write the resized image to the cache
$outputFunction($dst, $resized, -1);

// Send the new image to the browser
header("Content-type: $mime");
header('Content-Length: ' . filesize($resized));
$outputFunction($dst, null, -1);

Riguardo al discorso sicurazza, secondo me, non si può fare più di tanto perché per questo script è concepito per lavorare tramite prametri GET, ovvero tramite parametri sempre visibili.

Personalmente penso semplicemente che uno script del genere sarebbe più utile lato amministrazione dove effettivamente leghi l’id dell’immagine della tabella wp_posts (dato che si parla di wordpress) e poi setti le varie dimensioni di cui vuoi averlo. In questo modo si ci limita a passare solo un hash che identifichi il file già ridimensionato

# - postato da daniele_dll - 11 Marzo 2008 - 09:08

17

Daniele, ottime osservazioni. Scusami la piccola postilla: intanto non l’ho presentato come qualcosa di rivoluzionario o di innovativo. in questo genere di soluzioni, non so sei d’accordo, alla fine è sempre tutto un modificare, un re-inventare, un ri-proporre sotto altra veste soluzioni già sperimentate. Lo stesso succede con javascript: quante soluzioni per creare interfacce a tab sono venute fuori negli ultimi anni? decine, è chiaro che l’ultima arrivata dà la sensazione del deja-vu, ma magari contiene un piccolo dettaglio che fa comodo alle esigenze di qualcuno, per cui quel qualcuno la preferirà alle altre. tenete poi conto che, per fortuna o sfortuna non tocca a me dirlo, il pubblico di html.it e di questo blog è moooolto variegato rispetto a conoscenze, abilità, etc (abbiamo accesso a statistiche, dati, mail dei lettori, per cui un po’ sappiamo a chi ci rivolgiamo). quello che per uno è scontato o acqua calda per altri non lo è. vi assicuro che non è facile tenere una linea costante e ferma in certe condizioni, qualche compromesso ogni tanto tocca farlo. il fatto che con le vostre utilissime aggiunte abbiate arricchito il quadro, però, è la cosa che mi conforta, vuol dire che in fin dei conti la cosa non era poi così banale :)

# - postato da cesare - 11 Marzo 2008 - 13:25

18

@Cesare:
Si ma a volte la semplicità o l’acqua calda diventa pericolosa quando gente che non la sa usare si trova davanti spesso a condizioni abbastanza pericolose, come un codice che presenta diverse “falle” e la usa senza sapere cosa fa ..

penso che sia pure quello che voleva esprimere daniele con il suo intervento che appoggio in toto =)

# - postato da ringo_mato - 11 Marzo 2008 - 14:11

19

ringo, infatti, come ho detto, ho molto apprezzato l’intervento di Daniele :)

# - postato da cesare - 11 Marzo 2008 - 15:14

20

Concordo pienamente con ‘echat’… sicurezza davvero discutibile…

# - postato da MPLAB - 11 Marzo 2008 - 16:26

21

@cesare,
scusa mi sono reso conto che il mio intervento poteva sembrare poco educato nei tuoi confronti e nei confronti del blog.
Sono convinto che il vostro lavoro oltre a segnalare script per tutte “le tasche” sia quello di stimolare le discussioni.
Ci tengo a precisare che la mia non voleva essere una critica nei tuoi confronti, ma solo un modo provocatorio per dire che a me lo script non sembrava niente di che.
Ciao e buon lavoro

# - postato da Giovanni Battista Lenoci - 11 Marzo 2008 - 16:42

22

Ho letto i vostri commenti, non ho ben capito se ogni volta ridimensiona l’immagine e la archivia oppure semplicemente ridimensiona l’immagine e la da a schermo

# - postato da Peppo Internet - 10 Luglio 2008 - 10:57

Inserisci il tuo commento:





(puoi usare i seguenti tag HTML per formattare il testo -
a href, b, i, br/, p, strong, em, ul, ol, li, blockquote, pre):

 

Anteprima del commento