2012-04-11 3 views
1

Je suis en train de faire un programme pour compresser le fichier à tar.gz:tar.gz compress ne fonctionne pas pour le fichier GIF

Voici le code:

import java.io.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.util.zip.GZIPOutputStream; 
import org.apache.commons.compress.archivers.tar.TarArchiveEntry; 
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; 

public class Compress { 

    public static void main(String[] args) { 
     BufferedInputStream input = null; 
     try { 
      input = new BufferedInputStream(new FileInputStream(new File("input_filename.filetype"))); 
      TarArchiveOutputStream out = null; 
      try { 
       out = new TarArchiveOutputStream(new GZIPOutputStream(new BufferedOutputStream(new FileOutputStream("output_filename.tar.gz")))); 
       out.putArchiveEntry(new TarArchiveEntry(new File("input_filename.filetype"))); 

       int count; 
       byte data[] = new byte[input.available()]; 
       while ((count = input.read(data)) != -1) { 
        out.write(data, 0, count); 
       } 

       input.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex); 
      } finally { 
       if (out != null) { 
        try { 
         out.closeArchiveEntry(); 
         out.close(); 
        } catch (IOException ex) { 
         Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex); 
        } 
       } 
      } 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 
      try { 
       input.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 
} 

Je suis en utilisant Apache Commons Compression comme bibliothèque.

je test avec 2 conditions:

  1. Compress GIF
  2. Compress Fichier PDF

Et je compare compresser en utilisant PeaZip, voici le résultat:

  1. Compare GIF, From Left to Right -> Code Above, PeaZip, File Input
  2. Compare PDF, From Left to Right -> Code Above, PeaZip, File Input

Si le fichier d'entrée est GIF la taille de l'augmentation de fichier de compression, même si nous en utilisant PeaZip. Mais pour l'autre fichier, cela fonctionne pour le processus de compression.

Quelqu'un peut-il expliquer ce qui se passe avec cela? Y a-t-il un problème avec mon code?

Merci pour votre aide ...

+1

Bienvenue chez SO. +1 pour une question bien écrite, bien documentée. Je devrais probablement aussi -1 pour ne pas googler ceci, car c'est une caractéristique bien connue de la compression qui ne fonctionne qu'une seule fois. Comme le soulignent toutes les réponses, compresser quelque chose de déjà compressé le rendra probablement plus grand et non plus petit. Mais je vais vous donner le bénéfice du doute sur le -1 ;-) –

+0

Y at-il une suggestion que dois-je faire si je veux réduire la taille du fichier GIF sans réduire la dimension? Juste un mot clé, il serait utile pour moi :) – Crazenezz

+0

Comme toutes les réponses ont dit, vous ne pouvez pas le faire. Les fichiers GIF sont déjà aussi compressés qu'ils peuvent l'être. Vous pourriez trouver un algorithme de compression exotique qui peut réduire de 1%, mais c'est à peu près tout ce que vous obtiendrez. Ça ne vaut pas l'effort. Si vous voulez plus de compression, vous devez rechercher JPEG avec des paramètres de qualité médiocre. –

Répondre

3

Selon l'algorithme de compression que vous utilisez, vous obtiendrez des résultats différents - chaque type de fichier se compresse différemment. Les fichiers texte, par exemple, compressent extrêmement bien. De plus, comme les fichiers GIF sont déjà compressés à l'aide de la compression LZW, une seconde compression devrait avoir peu ou pas d'effet.

De Wikipédia, "Les images GIF sont compressées à l'aide de la technique de compression de données sans perte de Lempel-Ziv-Welch (LZW) pour réduire la taille du fichier sans dégrader la qualité visuelle."

Voir http://en.wikipedia.org/wiki/Graphics_Interchange_Format pour plus d'informations.

2

GIF fichiers sont déjà compressé (avec LZW) de sorte que vous n'obtiendrez pas beaucoup d'une amélioration en les comprimant à nouveau (c'est une « loi » de base de l'information théorie). En fait, et vous trouvez que la taille du fichier augmente car vous ne pouvez plus presser les données, mais vous devez ajouter une autre couche d'informations de contrôle de compression.

C'est probablement ce qui se passe dans votre cas.

2

La compression ne fonctionne que si le contenu peut être compressé. La plupart des fichiers GIF sont déjà compressés LZW, donc ils ne compressent généralement pas beaucoup plus; Une fois que vous avez inclus les en-têtes d'archive et les tables de données de compression, la modification nette est une augmentation de la taille du fichier. De nombreux fichiers PDF sont également compressés, de sorte que vous voyez souvent la même chose se produire; dans ce cas, le PDF est assez grand pour que la compression GZip (une version légèrement plus récente du même algorithme LZW) puisse trouver un peu plus de pression.

3

Les fichiers GIF et PDF sont généralement assez bien compressés, donc l'algorithme LZW (utilisé dans boh Zip et GZip si je me souviens bien) ne peut pas en retirer beaucoup plus. Imaginez si tous les fichiers peuvent être compressés.

Ensuite, nous pourrions simplement exécuter gzip jusqu'à ce que le fichier soit aussi petit que nous le désirons :-)

Questions connexes