2012-06-09 10 views
13

Naprawdę nie mogę zrozumieć, dlaczego GD ma inną funkcję ładowania obrazów, takich jak:Dlaczego istnieje imageCreateFrom *, jeśli istnieje imageCreateFromString?

imagecreatefromjpeg() 
imagecreatefrompng() 
imagecreatefromgif() 

Chociaż nie jest pojedynczą funkcję, jeśli obraz jest ciąg?

imagecreatefromstring() 

Rzeczywiście jest dużo lepiej czytać obraz w ciąg i przekazać go do funkcji, coś takiego:

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

? Lub czegoś mi brakuje? Mogło to doprowadzić do potencjalnego zamieszania dla nowych użytkowników.

Może zapomnieli po prostu utworzyć funkcję imageCreateFromFile()?

Ps. Oczywiście nie jestem zainteresowany o consumation pamięci przy użyciu metody file_get_contents

+3

Hmmm. Uczciwe pytanie. To jest podstawowa biblioteka PHP dla ciebie .... –

+2

Ponieważ celem PHP w życiu jest nadęty pełen bezużytecznych rzeczy, które można zrobić z łatwością z dodatkową linią. –

Odpowiedz

8

uruchamia przełącznik w stosunku do typu przekazanego obrazu, sprawdza, czy system obsługuje ten typ obrazu, a następnie uruchamia poprawną funkcję imagecreatefrom*.

Możesz sprawdzić kod źródłowy, aby zobaczyć: https://github.com/php/php-src/blob/master/ext/gd/gd.c?source=cc (linia 2280 dla funkcji, linia 2301, gdzie włącza typ obrazu i wywołuje właściwą funkcję).

Tak więc, funkcja imagecreatefromstring() jest naprawdę tylko opakowaniem pomocniczym. Otrzymasz bardzo niewielką korzyść z niezainstalowania _php_image_type (linia 2217), jeśli wywołasz rzeczywistą funkcję typu obrazu.

2
imagecreatefromjpeg() 
imagecreatefrompng() 
imagecreatefromgif() 

tworzenia zasobu obrazu z pliku - przekazać ścieżkę pliku jako parametr i że jedyna dopuszczalna wejściowego.

tworzy zasób obrazu z łańcucha, a nie z pliku - może to być praktycznie wszystko, można nawet wpisać treść. Na przykład można użyć

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

dostać piksel 1x1 przezroczysty gif (przydatne do śledzenia gify)

prawda, można przekazać wszystko przez imagecreatefromstring, ale nie byłoby pamięć wydajny - obsługa dużych obrazów zajmuje dużo pamięci i ma niski limit pamięci, który robi ogromną różnicę.

+1

To jednak nie stanowi odpowiedzi na pytanie - dlaczego podjęto decyzję architektoniczną? Dlaczego nie ma 'imagecreatefromfile()', który jest format agnostyczny? –

+0

Może to być kolejność dodawania rzeczy do PHP: 'imagecreatefrom *' funkcje były tam od czasu wydania PHP 4, 'imagecreatefromstring' nie było na początku - jest to dodatek 4.0.4. Domyślam się, że dodali funkcje specyficzne dla formatu pliku, później zrobili funkcję agnostyczną formatu, ale było już za późno na zmianę tego, co już zostało wydane. A ponieważ GD działa i nie ma żadnej rzeczywistej pracy wokół tego, nie zmieniły się od lat. – c2h5oh

+0

@ c2h5oh: Wierzę, że nie ma różnicy nawet w przypadku zużycia pamięci, ponieważ GD po imagecreatefromjpeg itp. Konwertuje obraz do formatu raw, a zużycie pamięci jest takie samo, przy obu funkcjach nadal będziesz mieć pełny obraz załadowany do pamięci – dynamic