2012-06-09 16 views
13

Realmente no puedo entender por qué GD tiene una función diferente para cargar las imágenes, tales como:¿Por qué hay imageCreateFrom * si hay imageCreateFromString?

imagecreatefromjpeg() 
imagecreatefrompng() 
imagecreatefromgif() 

Si bien no existe una única función de si la imagen es una cadena?

imagecreatefromstring() 

De hecho, es mucho mejor para leer la imagen en la cadena y pasarlo a la función, algo como:

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

? ¿O me falta algo? Esto podría conducir a una posible confusión para los usuarios nuevos

¿Tal vez se olvidaron de crear una función imageCreateFromFile()?

Ps. Por supuesto, no me interesa sobre consumación de memoria utilizando el método file_get_contents

+3

Hmmm. Buena pregunta. Esa es la biblioteca principal de PHP para ti .... –

+2

Porque el objetivo de PHP en la vida es estar lleno de cosas inútiles que podrías hacer fácilmente con una línea adicional. –

Respuesta

8

imagecreatefromstring() ejecuta un cambio contra el tipo de imagen pasada, comprueba si su sistema tiene soporte para ese tipo de imagen, y luego realmente ejecuta la función correcta imagecreatefrom*.

Puede consultar el código fuente para ver esto: https://github.com/php/php-src/blob/master/ext/gd/gd.c?source=cc (línea 2280 para la función, línea 2301 donde cambia el tipo de imagen y llama a la función correcta).

Por lo tanto, la función imagecreatefromstring() es realmente solo una capa auxiliar. Obtendrá un beneficio muy leve al no ejecutar _php_image_type (línea 2217) si llama a la función de tipo de imagen real.

2
imagecreatefromjpeg() 
imagecreatefrompng() 
imagecreatefromgif() 

crear recurso de imagen desde un archivo - pasa la ruta del archivo como parámetro y esa es la única entrada aceptable.

imagecreatefromstring() 

crea recurso de imagen de la cadena, no presenta - que podría ser casi cualquier cosa, incluso se puede escribir en un contenido. Por ejemplo, puede utilizar

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

conseguir 1x1 píxeles GIF transparente (útil para los gifs de seguimiento)

Por supuesto, usted podría pasar todo a través de imagecreatefromstring, pero no sería eficiente de la memoria - el manejo de grandes imágenes lleva mucha memoria y con un límite de memoria bajo que hace una gran diferencia.

+1

Esto realmente no responde la pregunta, sin embargo, ¿por qué se tomó esta decisión arquitectónica? ¿Por qué no hay 'imagecreatefromfile()' que tenga un formato agnóstico? –

+0

Podría ser el orden en que agregaron cosas a PHP: las funciones 'imagecreatefrom *' han estado allí desde que se lanzó PHP 4, 'imagecreatefromstring' no fue al principio, es una adición de 4.0.4. Supongo que agregaron funciones específicas para el formato de archivo y más adelante crearon una función de formato independiente, pero ya era demasiado tarde para cambiar lo que ya se había publicado. Y desde que GD funciona y no hay un trabajo real en torno a esto no ha cambiado durante años. – c2h5oh

+0

@ c2h5oh: creo que no hay diferencia ni siquiera para el consumo de memoria, porque GD después de crear imágenes de JPEG, etc. convierte la imagen en formato sin procesar y el consumo de memoria es el mismo, con ambas funciones todavía tendrá su imagen cargada en la memoria – dynamic