2012-06-09 28 views
13

Tôi thực sự không thể hiểu tại sao GD có chức năng khác nhau để tải hình ảnh đó như:Tại sao có imageCreateFrom * nếu có imageCreateFromString?

imagecreatefromjpeg() 
imagecreatefrompng() 
imagecreatefromgif() 

Trong khi có một chức năng duy nhất nếu hình ảnh là chuỗi?

imagecreatefromstring() 

Trên thực tế nó tốt hơn nhiều để đọc các hình ảnh vào chuỗi và vượt qua nó để chức năng, một cái gì đó như:

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

? Hoặc tôi đang thiếu một cái gì đó? Điều này có thể dẫn đến sự nhầm lẫn tiềm ẩn cho người dùng mới

Có thể họ chỉ quên tạo chức năng imageCreateFromFile()?

Ps. Dĩ nhiên tôi không quan tâm về bộ nhớ consumation bằng cách sử dụng phương pháp file_get_contents

+3

Hmmm. Câu hỏi công bằng. Đó là thư viện lõi PHP cho ya .... –

+2

Bởi vì mục đích của PHP trong cuộc sống là phải cồng kềnh đầy đủ những thứ vô dụng mà bạn có thể làm dễ dàng với một dòng phụ. –

Trả lời

8

imagecreatefromstring() chạy công tắc đối với loại hình ảnh được truyền, kiểm tra xem hệ thống của bạn có hỗ trợ cho loại hình ảnh đó không, và sau đó thực sự chạy đúng chức năng imagecreatefrom*.

Bạn có thể kiểm tra mã nguồn để xem điều này: https://github.com/php/php-src/blob/master/ext/gd/gd.c?source=cc (dòng 2280 cho hàm, dòng 2301 nơi nó chuyển sang loại hình ảnh và gọi hàm chính xác).

Vì vậy, chức năng imagecreatefromstring() thực sự chỉ là trình bao bọc trợ giúp. Bạn sẽ nhận được một lợi ích rất nhỏ từ việc không chạy _php_image_type (dòng 2217) nếu bạn gọi chức năng loại hình ảnh thực tế.

2
imagecreatefromjpeg() 
imagecreatefrompng() 
imagecreatefromgif() 

tạo nguồn hình ảnh từ một tập tin - bạn vượt qua đường dẫn tập tin như tham số và đó là chỉ đầu vào chấp nhận được.

imagecreatefromstring() 

tạo tài nguyên hình ảnh từ chuỗi chứ không phải tệp - hầu như mọi thứ, bạn thậm chí có thể nhập nội dung. Ví dụ, bạn có thể sử dụng

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

để có được 1x1 pixel gif trong suốt (hữu dụng cho gifs theo dõi)

Cấp, bạn có thể vượt qua tất cả mọi thứ thông qua imagecreatefromstring, nhưng nó sẽ không có bộ nhớ hiệu quả - xử lý hình ảnh lớn mất rất nhiều bộ nhớ và với giới hạn bộ nhớ thấp mà làm cho một sự khác biệt rất lớn.

+1

Điều này không thực sự trả lời câu hỏi, mặc dù - tại sao quyết định kiến ​​trúc này được thực hiện? Tại sao không có 'imagecreatefromfile()' có định dạng bất khả tri? –

+0

Nó có thể là thứ tự họ thêm vào PHP: 'imagecreatefrom *' đã có từ khi PHP 4 được phát hành, 'imagecreatefromstring' không phải lúc đầu - nó là 4.0.4. Tôi đoán là họ đã thêm các chức năng định dạng tập tin cụ thể, sau đó đã thực hiện một chức năng định dạng bất khả tri, nhưng đã quá muộn để thay đổi những gì đã được phát hành. Và kể từ khi GD làm việc và không có bất kỳ công việc thực tế thực hiện xung quanh điều này đã không thay đổi trong nhiều năm. – c2h5oh

+0

@ c2h5oh: tôi tin rằng không có sự khác biệt ngay cả đối với tiêu thụ bộ nhớ, bởi vì GD sau imagecreatefromjpeg vv chuyển đổi hình ảnh thành định dạng thô và bộ nhớ tiêu thụ là như nhau, với cả hai chức năng bạn vẫn sẽ có hình ảnh của bạn đầy tải trong bộ nhớ – dynamic

Các vấn đề liên quan