如果有imageCreateFromString,为什么会有imageCreateFrom *?

时间:2012-06-09 18:19:33

标签: php image gd

我真的不明白为什么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方法的内存消耗不感兴趣

2 个答案:

答案 0 :(得分:9)

imagecreatefromstring()针对传递的图像类型运行切换,检查您的系统是否支持该图像类型,然后实际运行正确的imagecreatefrom*函数。

您可以查看源代码以查看:https://github.com/php/php-src/blob/master/ext/gd/gd.c?source=cc(第2280行为函数,第2301行,它打开图像类型并调用正确的函数)。

因此,imagecreatefromstring()函数实际上只是一个辅助包装器。如果你调用实际的图像类型函数,你可以从不运行_php_image_type(第2217行)中获得非常小的好处。

答案 1 :(得分:2)

imagecreatefromjpeg() 
imagecreatefrompng() 
imagecreatefromgif()

从文件创建图像资源 - 您将文件路径作为参数传递,这是唯一可接受的输入。

imagecreatefromstring()

从字符串创建图像资源,而不是文件 - 它几乎可以是任何东西,甚至可以输入内容。例如,您可以使用

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

获得1x1像素透明gif(用于跟踪GIF)

当然,您可以通过imagecreatefromstring传递所有内容,但它不会提高内存效率 - 处理大型图像会占用大量内存并且内存限制较低会产生巨大差异。