2010-10-25 16 views
5

Quale metodo di compressione in Python ha il miglior rapporto di compressione?Compressione con il miglior rapporto in Python?

È il più comunemente usato zlib.compress() o ci sono delle opzioni migliori? Ho bisogno di ottenere il miglior rapporto di compressione possibile.

Sto comprimendo stringhe e inviandole su UDP. Una tipica stringa I comprime ha circa 1.700.000 byte.

risposta

6

sono sicuro che ci potrebbero essere alcuni formati più oscuri con una migliore compressione, ma LZMA è il migliore, di quelli che sono ben supportato. Ci sono alcuni collegamenti Python here.

EDIT

non scegliere un formato senza prove, alcuni algoritmi fare meglio a seconda del set di dati.

+0

Il mio set di dati è una lunga stringa che rappresenta un'immagine 640x480. –

+0

Se si stava già utilizzando un formato di immagine con un buon algoritmo di compressione, è necessario quindi comprimere di nuovo l'intera faccenda? – joni

+0

@joni L'immagine non era molto ben compresso. zlib.compress() lo ha ridotto a circa il 30% della dimensione originale. Ma sto cercando una compressione ancora più drastica. –

4

Se siete disposti a scambiare prestazioni per la compressione getter poi la libreria bz2 di solito dà risultati migliori rispetto alla biblioteca gz (zlib).

Non ci sono altre librerie di compressione come xz (LZMA2) che potrebbero dare risultati ancora migliori, ma non sembrano essere nella distribuzione principale di pitone.

Python Doc for BZ2 class

EDIT: A seconda del tipo di immagine non si potrebbe ottenere molto di compressione aggiuntiva. Molti formati di immagine sono stati precedentemente compressi a meno che non siano raw, bmp o tiff non compresso. Il test tra vari tipi di compressione sarebbe altamente raccomandato.

EDIT2: Se si decide di eseguire la compressione dell'immagine. Image Magick supporta i collegamenti Python e molti tipi di conversione delle immagini.

Image Magick

Image Formats Supported

+0

È un'immagine grezza. Non compresso. zlib.compress() lo ha ridotto al 30% delle dimensioni. –

+0

Poiché è un'immagine grezza, il binding LZMA dovrebbe fare un po 'meglio della libreria BZ2. Come suggerito sopra, dovresti essere in grado di utilizzare una compressione dell'immagine senza perdita con un risultato buono/migliore. – CtRanger

+0

@CtRanger: intendi * lossy * not * lossless *? Non è vero? – kriss

2

Se avete a che fare con le immagini si dovrebbe assolutamente scegliere un formato di compressione lossy (cioè: pixel consapevoli) di preferenza a qualsiasi lossless uno. Questo ti darà risultati molto migliori. La ricompressione con un formato senza perdita di dati in perdita è una perdita di tempo.

Vorrei cercare attraverso PIL per vedere cosa posso usare. Qualcosa come convertire l'immagine in jpeg con un rapporto di compressione compatibile con la qualità ricercata prima dell'invio dovrebbe essere molto efficiente.

Si dovrebbe anche essere molto cauti se si usa UDP, si possono perdere alcuni pacchetti, e il formato di compressione più sono molto sensibile alle parti del file mancante. OK. Questo può essere gestito a livello di applicazione.

+0

Quale formato di compressione lossy consigliate? –

+0

Il formato JPEG è un buon formato di immagine con perdita di dati, il formato PNG è un buon formato di immagine senza perdita di dati. Non direi che il lossy è sempre preferito, in realtà dipende dai dati. Lossy è preferito per le immagini rumorose; foto, scansioni, ecc. Lossless funziona bene per grafici, disegni al tratto, ecc. – adw

+0

@adw: Sono d'accordo con te PNG e JPEG sono entrambi buoni formati, ma se si tiene conto del rapporto di compressione, jpeg è molto meglio. Ho controllato la compressione PNG e basta usare DEFLATE (stesso algoritmo usato in zlib). – kriss

Problemi correlati