2010-10-25 27 views
5

Phương pháp nén nào trong Python có tỷ lệ nén tốt nhất?Nén với tỷ lệ tốt nhất trong Python?

Thường được sử dụng zlib.compress() tốt nhất hoặc có một số tùy chọn tốt hơn không? Tôi cần có tỷ lệ nén tốt nhất có thể.

Tôi đang tạo chuỗi và gửi chúng qua UDP. Một chuỗi điển hình tôi nén có khoảng 1.700.000 byte.

Trả lời

6

Tôi chắc chắn rằng có thể có một số định dạng ít người biết đến hơn với nén tốt hơn, nhưng lzma là tốt nhất, trong số đó được hỗ trợ tốt. Có một số ràng buộc python here.

EDIT

Đừng chọn một định dạng mà không cần thử nghiệm, một số thuật toán làm tốt hơn phụ thuộc vào tập dữ liệu.

+0

Tập dữ liệu của tôi là một chuỗi dài thể hiện hình ảnh 640x480. –

+0

Nếu bạn đã sử dụng định dạng hình ảnh với một thuật toán nén tốt, thì có cần thiết phải nén toàn bộ một lần nữa không? – joni

+0

@joni Hình ảnh không thực sự được nén tốt. zlib.compress() co lại thành cca 30% kích thước ban đầu. Nhưng tôi đang tìm kiếm sự nén mạnh mẽ hơn nữa. –

4

Nếu bạn sẵn sàng giao dịch hiệu suất cho nén getter thì thư viện bz2 thường cho kết quả tốt hơn thư viện gz (zlib).

Có các thư viện nén khác như xz (LZMA2) có thể cho kết quả tốt hơn nhưng chúng dường như không nằm trong phân phối lõi của python.

Python Doc for BZ2 class

EDIT: Tùy thuộc vào loại hình ảnh bạn có thể không nhận được nén nhiều bổ sung. Nhiều định dạng hình ảnh trước đó được nén trừ khi nó là thô, bmp hoặc tiff không nén. Thử nghiệm giữa các loại nén khác nhau sẽ được khuyến khích.

EDIT2: Nếu bạn quyết định thực hiện nén hình ảnh. Image Magick hỗ trợ các ràng buộc python và nhiều loại chuyển đổi hình ảnh.

Image Magick

Image Formats Supported

+0

Đó là hình ảnh thô. Không được biên soạn. zlib.compress() thu nhỏ nó xuống còn 30% kích thước. –

+0

Vì nó là một hình ảnh thô, ràng buộc LZMA nên làm tốt hơn một chút so với thư viện BZ2. Như đã đề xuất ở trên, bạn có thể sử dụng nén hình ảnh không mất dữ liệu với kết quả tốt/tốt hơn. – CtRanger

+0

@CtRanger: ý bạn là * mất dữ liệu * không * mất mát *? Phải không? – kriss

2

Nếu bạn đang đối phó với hình ảnh mà bạn chắc chắn nên chọn một định dạng nén lossy (ví dụ: điểm ảnh aware) tốt nhất cho bất kỳ lossless một. Điều đó sẽ cho bạn kết quả tốt hơn nhiều. Việc nén lại với định dạng lossless trên một thiết bị mất dữ liệu là mất thời gian.

Tôi sẽ tìm kiếm thông qua PIL để xem những gì tôi có thể sử dụng. Một cái gì đó như chuyển đổi hình ảnh để jpeg với một tỷ lệ nén tương thích với chất lượng nghiên cứu trước khi gửi nên rất hiệu quả.

Bạn cũng nên rất thận trọng nếu sử dụng UDP, nó có thể mất một số gói và hầu hết định dạng nén rất hợp lý để thiếu các phần của tệp. ĐƯỢC. Điều đó có thể được quản lý ở cấp ứng dụng.

+0

Bạn định giới thiệu định dạng nén nào? –

+0

JPEG là định dạng hình ảnh mất dữ liệu tốt, PNG là định dạng hình ảnh lossless tốt. Tôi sẽ không nói mất mát luôn được ưa thích, nó thực sự phụ thuộc vào dữ liệu. Lossy được ưu tiên cho hình ảnh nhiễu; hình ảnh, quét, vv Lossless hoạt động tốt cho đồ thị, dòng nghệ thuật, vv – adw

+0

@adw: Tôi đồng ý với bạn PNG và JPEG là cả hai định dạng tốt, nhưng nếu bạn đưa vào tỷ lệ nén tài khoản, jpeg là tốt hơn nhiều. Tôi đã kiểm tra nén PNG và nó chỉ sử dụng DEFLATE (cùng một thuật toán như được sử dụng trong zlib). – kriss

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