2012-08-10 40 views
10

Tôi đã tìm hiểu cách sử dụng PIL để nhận kích thước hình ảnh, nhưng không phải kích thước tệp theo byte. Tôi cần biết kích thước tệp để quyết định xem tệp có quá lớn để được tải lên cơ sở dữ liệu hay không.Cách lấy kích thước hình ảnh (byte) bằng PIL

+1

Bạn có tạo hình ảnh hoặc hình ảnh được lưu trữ trên đĩa không? –

+2

Sử dụng API hệ thống tệp để nhận kích thước tệp chứ không phải PIL. – wberry

+1

hoặc 'len()', nếu bạn có nó trong bộ nhớ chứ không phải trên hệ thống tệp (có vẻ như bạn đang lưu trữ dưới dạng BLOB trong cơ sở dữ liệu.) – geoffspear

Trả lời

14

Hãy thử:

import os 
print os.stat('somefile.ext').st_size 
+0

hiện có cách nào để sử dụng PIL? –

+3

Tại sao bạn cần sử dụng PIL? – thebjorn

+0

để kiểm soát nếu nó là một hình ảnh không phải là một tiêu đề hình ảnh giả mạo, để làm cho một hồ sơ tải lên, và sau đó lưu nó vào cơ sở dữ liệu, do đó, nó là rõ ràng để thực hiện một phương pháp trong PIL để có được kích thước trong byte không? –

5

tôi là một chút muộn để điều này, nhưng tôi đã xem qua câu hỏi này 5 phút trước khi tìm kiếm như thế nào để có được kích thước của một hình ảnh PIL mà không lưu nó vào đĩa. Trong trường hợp bất cứ ai khác đi qua này, đây là một cách đơn giản để làm việc đó:

import StringIO 
output = StringIO.StringIO() 
image_output.save(output, 'PNG') #a format needs to be provided 
contents = output.getvalue() 
output.close() 

image_filesize = len(contents) 
5

Nếu bạn đã có hình ảnh trên hệ thống tập tin:

import os 
os.path.getsize('path_to_file.jpg')` 

Tuy nhiên, nếu bạn muốn để có được kích thước lưu của một hình ảnh đó là trong bộ nhớ và chưa được lưu vào hệ thống tập tin:

from io import BytesIO 
img_file = BytesIO() 
image.save(img_file, 'png') 
image_file_size = img_file.tell() 

phương pháp này sẽ tránh được nhiều lần đọc các dữ liệu hình ảnh như với StringIO. Lưu ý, tuy nhiên, nó sẽ sử dụng nhiều RAM hơn. Tất cả mọi thứ là một sự cân bằng. :-)

Chỉnh sửa: Tôi chỉ thấy nhận xét này từ OP:

cuối cùng, vấn đề là từ beginnig, nếu ai đó sẽ tải lên một bức tranh có 1 giga (giả mạo một) ông' sẽ giết máy chủ trước khi PIL sẽ thực hiện công cụ của nó, vì vậy tôi phải chặn yêu cầu trước khi nó kết thúc!

Đây là một câu hỏi rất khác và có thể được thực hiện tốt nhất tại máy chủ web. Đối với nginx, bạn có thể thêm cấu hình này vào cấu hình của mình:

http { 
    #... 
     client_max_body_size 100m; # or whatever size you want as your limit 
    #... 
} 
+0

Phương pháp 'BytesIO' dường như đánh giá thấp kích thước so với kích thước từ bàn làm việc. Bất kỳ ý tưởng tại sao? – getup8

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