Почему есть imageCreateFrom *, если есть imageCreateFromString?
Я действительно не могу понять, почему у GD есть другая функция для загрузки таких изображений, как:
imagecreatefromjpeg()
imagecreatefrompng()
imagecreatefromgif()
Пока существует одна функция, если изображение является строкой?
imagecreatefromstring()
Действительно, гораздо лучше прочитать изображение в строке и передать его функции, что-то вроде:
$imgBlob = file_get_contents($imagePath);
imagecreatefromstring($imageBlob);
unset($imgBlob); //> Free memory, but I am not interested in memory consumpation
? Или я чего-то не хватает? Это может привести к путанице для новых пользователей.
Может, они просто забыли создать функцию imageCreateFromFile()
?
Ps. Конечно, меня не интересует потребление памяти с помощью метода file_get_contents
Ответы
Ответ 1
imagecreatefromstring()
запускает переключатель в отношении типа пройденного изображения, проверяет, поддерживает ли ваша система этот тип изображения, а затем фактически запускает правильную функцию imagecreatefrom*
.
Вы можете проверить исходный код, чтобы увидеть это: https://github.com/php/php-src/blob/master/ext/gd/gd.c?source=cc (строка 2280 для функции, строка 2301, где он включает тип изображения и вызывает правильная функция).
Итак, функция imagecreatefromstring()
на самом деле просто вспомогательная оболочка. Вы получите очень небольшое преимущество, если не используете _php_image_type
(строка 2217), если вы вызываете фактическую функцию типа изображения.
Ответ 2
imagecreatefromjpeg()
imagecreatefrompng()
imagecreatefromgif()
создать ресурс изображения из файла - вы передаете путь к файлу в качестве параметра и что единственный приемлемый ввод.
imagecreatefromstring()
создает ресурс изображения из строки, а не файла - это может быть практически что угодно, вы даже можете вводить содержимое. Например, вы можете использовать
imagecreatefromstring(base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw=='));
чтобы получить прозрачный gif 1x1 пиксель (полезно для отслеживания gif)
Конечно, вы можете передать все через imagecreatefromstring
, но это не будет эффективно с точки зрения памяти - обработка больших изображений занимает много памяти и с низким пределом памяти, что имеет огромное значение.