2012-06-09 6 views
13

Io davvero non riesco a capire il motivo per cui GD ha funzione diversa per il caricamento delle immagini tali come:Perché c'è imageCreateFrom * se c'è imageCreateFromString?

imagecreatefromjpeg() 
imagecreatefrompng() 
imagecreatefromgif() 

Mentre v'è una singola funzione se l'immagine è stringa?

imagecreatefromstring() 

In effetti è molto meglio a leggere l'immagine nella stringa e passarlo alla funzione, qualcosa come:

$imgBlob = file_get_contents($imagePath); 
imagecreatefromstring($imageBlob); 
unset($imgBlob); //> Free memory, but I am not interested in memory consumpation 

? O mi manca qualcosa? Ciò potrebbe comportare una potenziale confusione per i nuovi utenti

Forse hanno appena dimenticato di creare una funzione imageCreateFromFile()?

Ps. Naturalmente io non sono interessati circa consumazione di memoria utilizzando il metodo file_get_contents

+3

Hmmm. Domanda giusta Questa è la libreria di base di PHP per te .... –

+2

Perché lo scopo di PHP nella vita è essere gonfio di cose inutili che potresti fare facilmente con una linea in più. –

risposta

8

imagecreatefromstring() esegue un passaggio sul tipo di immagine passato, controlla se il sistema ha il supporto per quel tipo di immagine e quindi esegue effettivamente la funzione imagecreatefrom* corretta.

È possibile controllare il codice sorgente per vedere questo: https://github.com/php/php-src/blob/master/ext/gd/gd.c?source=cc (riga 2280 per la funzione, riga 2301 dove si attiva il tipo di immagine e chiama la funzione corretta).

Quindi, la funzione imagecreatefromstring() è in realtà solo un wrapper di supporto. Otterrai un leggero vantaggio nel non eseguire _php_image_type (riga 2217) se chiami la funzione del tipo di immagine reale.

2
imagecreatefromjpeg() 
imagecreatefrompng() 
imagecreatefromgif() 

Crea una risorsa immagine da un file - si passa il percorso del file come parametro di e questo è l'unico input accettabile.

imagecreatefromstring() 

crea una risorsa immagine da stringa, non file - potrebbe essere praticamente qualsiasi cosa, è possibile anche digitare un contenuto. Per esempio è possibile utilizzare

imagecreatefromstring(base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw=='));

per ottenere 1x1 pixel gif trasparente (utile per tenere traccia gif)

Certo, si potrebbe passare tutto attraverso imagecreatefromstring, ma non sarebbe efficiente della memoria - la manipolazione immagini di grandi dimensioni richiede molta memoria e con un limite di memoria basso che fa una grande differenza.

+1

Questo in realtà non risponde alla domanda, però - perché è stata presa questa decisione architettonica? Perché non c'è 'imagecreatefromfile()' che è formato in modo agnostico? –

+0

Potrebbe essere l'ordine in cui hanno aggiunto le cose a PHP: le funzioni 'imagecreatefrom *' sono presenti fin da quando è stato rilasciato PHP 4, 'imagecreatefromstring' non era all'inizio - è un'aggiunta 4.0.4. La mia ipotesi è che abbiano aggiunto funzioni specifiche per il formato di file, in seguito abbiano formato una funzione agnostica del formato, ma era troppo tardi per cambiare ciò che è già stato rilasciato. E dal momento che GD funziona e non c'è un vero lavoro svolto intorno a questo non sono cambiati da anni. – c2h5oh

+0

@ c2h5oh: credo che non ci siano differenze anche per il consumo di memoria, perché GD dopo imagecreatefromjpeg ecc converte l'immagine in formato raw e il consumo di memoria è lo stesso, con entrambe le funzioni l'immagine verrà caricata completamente nella memoria – dynamic

Problemi correlati