2010-10-26 42 views
7

Tôi đang đổi kích thước hình ảnh bằng php gd. Kết quả là tài nguyên hình ảnh mà tôi muốn tải lên Amazon S3. Nó hoạt động tốt nếu tôi lưu trữ hình ảnh trên đĩa đầu tiên nhưng tôi muốn tải chúng trực tiếp từ bộ nhớ. Điều đó là có thể nếu tôi chỉ biết byteize của hình ảnh.Cách lấy kích thước tài nguyên hình ảnh theo byte bằng PHP và GD?

Có cách nào để nhận kích thước (tính theo byte) của tài nguyên hình ảnh gd không?

+0

Bạn không thể tải lên tài nguyên. –

Trả lời

12

Bạn có thể sử dụng số memory i/o stream của PHP để lưu hình ảnh vào và sau đó nhận được kích thước tính theo byte.

Những gì bạn làm là:

$img = imagecreatetruecolor(100,100); 
// do your processing here 
// now save file to memory 
imagejpeg($img, 'php://memory/temp.jpeg'); 
$size = filesize('php://memory/temp.jpeg'); 

Bây giờ bạn nên biết kích thước

Tôi không biết về bất kỳ phương pháp (gd) để có được kích thước của một nguồn tài nguyên hình ảnh.

+1

Vấn đề là các hàm 'gd' mong đợi một đường dẫn, không phải là một tài nguyên tệp, để ghi vào. Điều này sẽ làm việc với [output buffering] (http://php.net/manual/en/function.ob-start.php) thay vào đó. – deceze

+0

@deceze: Bạn sẽ có thể cung cấp một đường dẫn như: 'php: // memory/resource = img.jpeg' –

+0

Tuyệt vời, giải thích tốt. – deceze

-1

Lưu tệp hình ảnh ở định dạng mong muốn vào thư mục tmp, sau đó sử dụng filesize() http://php.net/manual/de/function.filesize.php trước khi tải tệp lên S3 từ đĩa.

+0

Đây là phiên bản tiếng Anh: http://www.php.net/manual/en/function.filesize.php :) – infinity

+0

Lưu một tệp tạm thời trên đĩa là chính xác những gì tôi đang cố gắng tránh ở đây. – Martin

+0

Tại sao? Nó không phải là một vấn đề hiệu suất và tiết kiệm rất nhiều RAM. – joni

0

Bạn có thể xem câu trả lời sau để được trợ giúp. Nó hoạt động cho những thay đổi bộ nhớ chung trong php. Mặc dù từ trên cao có thể được tham gia nó có thể là nhiều hơn một ước tính.

Getting size of PHP objects

9

tôi không thể viết lên php: // nhớ với imagepng, vì vậy tôi sử dụng ob_start(), ob_get_content() kết thúc ob_end_clean()

$image = imagecreatefrompng('./image.png'); //load image 
// do your processing here 
//... 
//... 
//... 
ob_start(); //Turn on output buffering 
imagejpeg($image); //Generate your image 

$output = ob_get_contents(); // get the image as a string in a variable 

ob_end_clean(); //Turn off output buffering and clean it 
echo strlen($output); //size in bytes 
+1

Tại sao không sử dụng 'ob_get_length' như @JonathanWren được đề xuất? – Wilt

5

này cũng hoạt động:

$img = imagecreatetruecolor(100,100); 

// ... processing 

ob_start();    // start the buffer 
imagejpeg($img);   // output image to buffer 
$size = ob_get_length(); // get size of buffer (in bytes) 
ob_end_clean();   // trash the buffer 

Và bây giờ $size sẽ có kích thước bằng byte.

+0

Cảm ơn bạn. Điều này đã giúp tôi vì tôi cần một cách để xác định kích thước tệp mà không cần tải lên. – Benjamin

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