2012-05-15 54 views
31

Tôi đang sử dụng PIL để đổi kích thước hình ảnh ở đó bằng cách chuyển đổi hình ảnh lớn hơn thành hình nhỏ hơn. Có cách nào tiêu chuẩn để giảm kích thước tệp của hình ảnh mà không làm mất chất lượng quá nhiều không, cho phép nói kích thước ban đầu của hình ảnh là 100KB, tôi muốn giảm xuống còn 5 hoặc 10 KB đặc biệt cho định dạng png và jpeg.Cách giảm kích thước tệp hình ảnh bằng PIL

+0

Bạn định nghĩa là mất chất lượng "quá nhiều"? Nếu bạn muốn giảm kích thước tập tin theo hệ số từ 10 đến 20, cách dễ nhất là giảm số lượng pixel. Giảm cả chiều rộng và chiều cao bằng 2/3 sẽ cho bạn một bức tranh khoảng 1/9 kích thước của bản gốc. Nhưng đó là khá nhiều giải pháp bạn mất. –

Trả lời

1

Xem chức năng thumbnail của Mô-đun hình ảnh của PIL. Bạn có thể sử dụng nó để lưu các phiên bản tệp nhỏ hơn dưới dạng các loại tệp khác nhau và nếu bạn muốn giữ lại càng nhiều chất lượng càng tốt, hãy xem xét sử dụng bộ lọc ANTIALIAS khi bạn làm.

Ngoài ra, tôi không chắc chắn có cách nào để chỉ định kích thước mong muốn tối đa hay không. Bạn có thể, tất nhiên, viết một hàm có thể thử lưu nhiều phiên bản của tệp ở các chất lượng khác nhau cho đến khi một kích thước nhất định được đáp ứng, loại bỏ phần còn lại và cung cấp cho bạn hình ảnh bạn muốn.

+0

là có cách để giảm kích thước tệp bằng cách giữ nguyên tham số không đổi. cho các định dạng png. –

+1

Nếu bạn muốn giữ cùng kích thước, điều duy nhất bạn có thể thử là đặt cài đặt chất lượng khi bạn lưu hình ảnh. Kiểm tra [câu trả lời này] (http://stackoverflow.com/a/1405701/369878) – Cryptite

+0

nhưng thuộc tính chất lượng không có sự khác biệt cho các định dạng png.thay đổi tôi thay đổi chất lượng kích thước tệp vẫn giữ nguyên. –

54

Thông số được tích hợp để lưu JPEG và PNG là optimize.

# My image is a 200x374 jpeg that is 102kb large 
>>> foo = Image.open("path\\to\\image.jpg") 
>>> foo.size 
    (200,374) 
# I downsize the image with an ANTIALIAS filter (gives the highest quality) 
>>> foo = foo.resize((160,300),Image.ANTIALIAS) 
>>> foo.save("path\\to\\save\\image_scaled.jpg",quality=95) 
# The saved downsized image size is 24.8kb 
>>> foo.save("path\\to\\save\\image_scaled_opt.jpg",optimize=True,quality=95) 
# The saved downsized image size is 22.9kb 

Cờ optimize sẽ làm tăng thêm hình ảnh để tìm cách giảm kích thước của nó càng nhiều càng tốt. 1,9kb có thể không có vẻ như nhiều, nhưng hơn hàng trăm/hàng ngàn hình ảnh, nó có thể tăng lên.

Bây giờ để thử và giảm xuống 5kb đến 10 kb, bạn có thể thay đổi giá trị chất lượng trong các tùy chọn lưu. Sử dụng một chất lượng 85 thay vì 95 trong trường hợp này sẽ mang lại: unoptimized: 15.1kb Tối ưu hóa: 14.3kb Sử dụng một chất lượng 75 (mặc định nếu lập luận là trái ra) sẽ mang lại: unoptimized: 11.8kb Tối ưu hóa: 11.2kb

Tôi thích chất lượng 85 với tối ưu hóa vì chất lượng không bị ảnh hưởng nhiều và kích thước tệp nhỏ hơn nhiều.

8

phép nói rằng bạn có một mô hình gọi là Sách và trên đó một lĩnh vực được gọi là 'cover_pic', trong trường hợp đó, bạn có thể làm như sau để nén hình ảnh:

from PIL import Image 
b = Book.objects.get(title='Into the wild') 
image = Image.open(b.cover_pic.path) 
image.save(b.image.path,quality=20,optimize=True) 

hy vọng nó sẽ giúp cho bất cứ ai tình cờ trên no.

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