IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Décompresser un flux de données


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Par défaut Décompresser un flux de données
    Bonjour,

    Je souhaite décompresser le flux de données d'une image png compréssées via une méthode zip, j'ai essayé beaucoup de choses, et je suis à cours d'idées.

    J'ai tenté les formats disponibles de la classe util.zip, les inflater, les InflaterInputStream, j'ai cherché des exemples et de la doc, j'ai adapté celui de la jdoc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DataInputStream ISdeflated = new DataInputStream(new BufferedInputStream(new FileInputStream("out.txt")));
    byte[] deflatedbytearray = new byte[ISdeflated.available()];
     
    ISdeflated.read(deflatedbytearray, 0, ISdeflated.available());
     
    Inflater  inflated = new Inflater(true);
    inflated.setInput(deflatedbytearray);
     
    byte[] resultarray = new byte[longueurFichier*largeurFichier];
    inflated.inflate(resultarray);
    inflated.end();
    résultat: "invalid stored block lengths". J'ai découvert que c'était dû au "new inflater(true);"
    Sans le "true", pas d'erreur mais l'affichage de resultarray me sort une série de 0.

    Et un autre que j'ai difficilement trouvé: ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    DataInputStream ISdeflated = new DataInputStream(new BufferedInputStream(new FileInputStream("out.txt")));
    byte[] deflatedbytearray = new byte[ISdeflated.available()];
    ISdeflated.read(deflatedbytearray, 0, ISdeflated.available());
     
    ByteArrayOutputStream bos = new ByteArrayOutputStream(deflatedbytearray.length);
     
    Inflater  inflated = new Inflater();
    inflated.setInput(deflatedbytearray);
     
    byte[] buf = new byte[2048];
    while (!inflated.finished())
    {
            int count = inflated.inflate(buf);
            bos.write(buf, 0, count);
    }
    bos.close();
     
    byte[] resultarray = bos.toByteArray();
    résultat: "need dictionary".

    Donc j'ai exploré et beaucoup de détails bizarres et de questions se sont accumulés, comme:
    -"Comment récupérer et utiliser un dictionnaire un adler32 ou un CRC?", ou
    -"Mon flux dispose d'un bloc CRC, dois-je quand même utiliser un Adler32?" et
    -"Dois-je intégrer mon bloc CRC au flux à décompresser ou le récupérer à part"?
    entre autres...

    Les exemples sur util.zip sont rares et assez peu clairs sur le rôle de chaque objet, et les cours inexistants.

    Quelqu'un sait-il se servir des inflater s'il vous plait?

    Merci d'avance.

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Bonjour,

    J'ai du mal à comprendre , tu essais de lire la matrice de l'image à l'intérieur du fichier png, c'est ça ?

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par FreeSample Voir le message
    Je souhaite décompresser le flux de données d'une image png compréssées via une méthode zip
    ...
    [CODE]DataInputStream ISdeflated = new DataInputStream(new BufferedInputStream(new FileInputStream("out.txt")));
    Est-ce normal que ton fichier d'entré soit "out.txt" ? C'est pas vraiment un nom habituel pour une image png.

    Pour décompresser un flux zip ZipInputStream.

    Remarque HS : généralement, par convention, le nom des variables commence par une minuscule
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  4. #4
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Par défaut
    Bonjour, Oui, j'ai extrait le chunk IDAT d'un fichier png et mis à part dans le fichier fichier "out.txt". A l'extraction, ca me semblait logique, mais c'est vrai qu'ici, ça fait un peu bizarre.

    Maintenant, je souhaite le décompresser.
    C'est vrai que je peux me permettre de sauter le passage en .txt et stocker le flux directement dans un tableau de bytes. Vous croyez que le passage par le format txt errone les données à un niveau quelconque?

    Pour le ZipInputStream, j'ai commencé par là, mais ça n'a pas donné plus de résultats que les autres, et j'ai fini par comprendre (enfin je crois) que cet objet était réservé aux fichiers .zip. L'inflater, lui, semble traiter n'importe quel type de flux, tant qu'il est encodé et reconnaissable.

    Ou alors je me plante lamentablement?

    Merci pour vos réponses en tout cas.

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par FreeSample Voir le message
    Bonjour, Oui, j'ai extrait le chunk IDAT d'un fichier png et mis à part dans le fichier fichier "out.txt". A l'extraction, ca me semblait logique, mais c'est vrai qu'ici, ça fait un peu bizarre.

    Maintenant, je souhaite le décompresser.
    C'est vrai que je peux me permettre de sauter le passage en .txt et stocker le flux directement dans un tableau de bytes. Vous croyez que le passage par le format txt errone les données à un niveau quelconque?
    Le fait de l'écrire dans un fichier externe n'altère pas les données, le nom du fichier n'a aucune importance. Ma remarque était seulement due au fait que le nom choisi n'était pas très parlant.

    Citation Envoyé par FreeSample Voir le message
    Pour le ZipInputStream, j'ai commencé par là, mais ça n'a pas donné plus de résultats que les autres, et j'ai fini par comprendre (enfin je crois) que cet objet était réservé aux fichiers .zip. L'inflater, lui, semble traiter n'importe quel type de flux, tant qu'il est encodé et reconnaissable.
    Disons que le ZipInputStream permet de décoder un flux encodé au format zip (pas forcément un fichier, mais il faut que ce soit encodé au format zip). La classe Inflater elle permet de décompresser un flux compresser au format ZLIB.

    Ta façon de lire le fichier n'est pas correct. La méthode available() ne renvoie pas le nombre d'octets total du fichier, mais seulement le nombre pouvant être lu sans potentiellement provoquer de lecture bloquante sur ce flux.
    La lecture d'un flux se fait généralement via une boucle tant que la méthode read(buffer) renvoie > 0.
    Sinon regarde du coté du InflaterInputStream ça pourrait te simplifier la tâche pour utiliser le Inflater.

    Une autre remarque, pense à fermer les flux dans un bloc finally .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    C'est bien ce que je pensais.

    La matrice de l'image dans le format png correspond bien à l'algo deflate en théorie. Techniquement il doit y avoir une subtilité pour le lire. Il faut retrouver les spécifications de cette partie. C'est normalisé tu ne devrais pas avoir trop de soucis pour l'obtenir.

    Pas trop de soucis au niveau du .txt, même si c'est pas propre , rien n'est transformé, sauf si tu l'ouvres et que tu le sauves avec un éditeur, là il y a un risque de conversion de certains caractères.

  7. #7
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Par défaut
    Bonjour,

    Merci pour vos reponses et desolé pour le delai, j'ai passé une semaine en Ariège entre Labouiche et le pouech sans l'ombre d'une connexion.

    D'accord pour le test sur le read(buffer)>0, ca devrait etre plus censé, si le flux n'est pas entier, pas etonnant qu'il n'arrive pas a le décompresser.

    Poir l'encodage, il est dit dans les specifications du png que c'est "un dérivé de la methode zip, pas beaucoup plus d'infos a premiere vue, et j'ai prié pour qu'elle ne dérive pas trop de l'original... j'ai plus qu'à faire des recherches et des tests.

    Merci poir vos indications.

  8. #8
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Par défaut
    Bonjour, je viens pour enfin clôturer ce post:

    Merci le Y@m's pour l'InflaterInputStream, ce n'est pas l'objet que j'aurais choisi d'utilisé et c'est pourtant le plus simple.

    Jimmy_, pour la méthode de compression, j'ai vérifié les spec png et zlib, et il s'agit bien de la bonne méthode de compression, zlib, j'ai vérifié les octets d'entête de mon flux, donc pas de dérivé à un quelconque degré de la méthode.

    Je ne passe plus par un fichier texte, mais je récupère le byteArrayInputStream du IDAT, je ne pense pas que ça soit nécessaire mais ça simplifie quand même.

    la série de zéros venait en fait du avaliable qui en effet se limite à la capacité du buffer, donc seuls les 4500 premiers champs de mon bytearray de flux décompressé étaient remplis (et la console Eclipse n'affichait que les champs de 4600 à 12000).

    Merci beaucoup pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Flux de données C# 2.0
    Par jpo dans le forum Accès aux données
    Réponses: 2
    Dernier message: 12/10/2006, 09h13
  2. [AJAX/XML/JAVA] Afficher un flux de données depuis un site web
    Par chodaboy34 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/10/2006, 16h38
  3. Réponses: 1
    Dernier message: 24/05/2006, 12h10
  4. [XML] [EXPAT] traitement d'un flux de donnée xml contenant des \n
    Par firejocker dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 23/02/2006, 16h49
  5. Rediriger un flux de données sous linux
    Par Nicaisse dans le forum POSIX
    Réponses: 7
    Dernier message: 01/07/2003, 16h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo