2012-06-09 45 views
13

我真的不明白爲什麼GD具有裝載圖像,就像不同的功能:爲什麼有imageCreateFrom *如果有imageCreateFromString?

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方法

+3

嗯。公平的問題。這是PHP的核心庫亞.... –

+2

因爲PHP的生活目標是臃腫充滿無用的東西,你可以輕鬆地做一個額外的線。 –

回答

8

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() 

從文件創建圖像資源沒興趣有關內存consumation - 你傳遞文件的路徑作爲參數,這是唯一可以接受的輸入。

imagecreatefromstring() 

從字符串創建圖像資源,而不是文件 - 它可以是幾乎任何東西,甚至可以輸入內容。例如,你可以使用

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

獲得1x1像素透明GIF

當然,你可以通過imagecreatefromstring通過一切(用於跟蹤的GIF很有用),但它不會是內存使用效率 - 處理大型圖片需要大量的內存和低內存限制,這會產生巨大的差異。

+1

但這並沒有真正回答這個問題 - 爲什麼要做出這個架構決策?爲什麼沒有格式不可知的'imagecreatefromfile()'? –

+0

這可能是他們向PHP添加東西的順序:自從PHP 4發佈以來,'imagecreatefrom *'函數就已經存在,'imagecreatefromstring'一開始並不是 - 它是4.0.4的補充。我的猜測是他們已經添加了文件格式特定的功能,後來做出了格式不可知的功能,但是要改變已經發布的內容爲時已晚。由於GD的工作原理,並沒有任何真正的工作在這方面做了多年沒有改變。 – c2h5oh

+0

@ c2h5oh:我相信即使對於內存消耗也沒有什麼區別,因爲在imagecreatefromjpeg等格式的GD將圖像轉換爲原始格式並且內存消耗是相同的,這兩種功能都會將您的映像全部加載到內存中 – dynamic

相關問題