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 :

Exploiter correctement un flux de données png


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 Exploiter correctement un flux de données png
    Bonjour,

    Je poste mon premier message et c'est du lourd (à lire surtout, )

    Voila, je code une routine d'extraction de données de fichiers png. J'ai trié les données qu'ils contiennent et je veux maintenant extraire les données brutes de l'image, et c'est là que les choses se compliquent:

    Les données contenues dans le fichier sont pêle-mêle, des characteres, des entiers sur 4 octets, des entiers sur 1 octet et des données compressées.
    Voici à quoi ressemble ça ressemble :

    • | longueur du bloc| nom du bloc | données du bloc
    • | 0 | 0 | 5 | 224 | 73 | 68 | 65 | 84 | 120|156|205|153|75|...
    • | entier = 1504 | chars= "IDAT" | données compressées sur 1504o


    le process est donc : J'identifie le bloc "IDAT", reviens en arrière pour prendre la longueur du bloc et retourner récupérer les données sur la longueur voulue.

    Mon problème étant que je ne trouve pas de moyen efficace de récupérer mes données compressées parce les deux formats (le datainputstream et le tableau de bytes) ne permettent pas de naviguer correctement dans le flux( le curseur du datainputstream ne peut qu'avancer), ou pas de lire correctement les données( je n'ai pas trouvé comment obtenir 1504 en concaténant ou additionnant les 4 cellules du tableau).

    la seule solution que j'ai trouvé est de faire un objet de chaque et de me servir du tableau pour naviguer et du datainputstream pour récupérer les données, ce qui n'est absolument pas pratique ni sûr de fonctionner.

    Quelqu'un Connait-il une alternative?

    J'ai essayé d'être le plus clair possible, je m'excuse si ca ne l'est pas.

    Autre problème, les données sont compressées selon, je cite:"un dérivé du LZ77 utilisé dans les programmes zip" (cf: specifications png)
    Quelqu'un sait à quel point il en est dérivé? si j'utilise la class util.zip, ai-je une chance de récupérer ce que je devrais? ou dois-je utiliser le zlib? (j'avoue, je n'ai pas encore trouvé comment ajouter le pack zlib en C++ à mon projet java, mais je crois que c'est possible, ).

    Je sais que j'en demande beaucoup d'un coup mais j'ai poussé au maximum mes recherches avant de venir ici, et les questions se sont un peu accumulées... pardon et merci.

    Cordialement.

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    J'aurai procédé d'une autre façon qui permet la récupération des informations en une seule passe.

    Soit :
    En 1. ouverture du fichier.
    En 2. Lecture d'une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filereader.readLine() ?
    jadadoc BufferedReader
    En 3. split de la ligne sur les pipe "|"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String mySplitedLine= myLine.slipt("|");
    En 4. lecture du bloc "IDAT"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mySplitedLine[1].equals(chars= "IDAT"))
    Note utilise la méthode "contains" si tu ne sais pas si il y a des espace à la fin. Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mySplitedLine[1].contains("IDAT"))
    En 5. lecture de ton premier champs.

    Si ton champs ne se trouve pas en début de ligne, mais au milieu d'une ligne. Une simple itération sur le tableau splitté devrait suffire.

    Cordialement,
    Patrick Kolodziejczyk.

    PS: Si un problème est trop compliquer, c'est que tu ne l'as pas assez simplifier.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    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ésolé, ca ne marche pas.

    Le flux n'a ni ligne, ni pipe, je les ai ajouté pour faciliter la lecture.

    Et le bufferedreader convertit le flux de données en caractères, même les octets à prendre sous forme d'entier. J'ai commencé par là, et voici un morceau du premier extract du fichier avec un bufferedreader:
    "...àIDATxœÍ™KnÛ0†½÷R..."

    De même, il n'y a pas de marqueur de fin de bloc, c'est pour cela que j'ai besoin de la longueur(les caractères "à") pour arrêter la lecture.

    De plus, l'objet bufferedreader possède les mêmes méthodes que datainputstream, donc pas de retour en arrière possible à la lecture d'un stream.
    J'ai ensuite opté pour la méthode read(byte [], int off, int len), mais avec le format tableau de byte, je ne sais pas comment retrouver la valeur 1504 avec les bytes 0, 0, 5, 224 rangés chacun dans une cellule du tableau.
    Il me suffirait de pouvoir retrouver cette valeur et tous mes problèmes seraient réglés.

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Alors il te faut la classe DataInputStream...

    Où les fonctions readInt() ou readLong() ou encore readShort()...
    Te permettront de lire le nombre de caractère à lire ou à ignorer.
    Et bien-sûr la fonction skipBytes(int n) qui peut-être utile pour les passage qui servent à rien.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    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'accord, j'en suis là, mais est-il possible, une fois que j'ai trouvé mon bloc "IDAT", de revenir en arrière de 8 octets dans mon flux afin de récupérer la longueur du bloc? Toutes les fonctions que j'ai trouvé ne font qu'avancer le pointeur.

    Merci pour vos réponses.

  6. #6
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    PS: Si un problème est trop compliquer, c'est que tu ne l'as pas assez simplifier.
    Mémorise le avant, c'est le plus simple.
    A chaque fois que tu vois un bloc qui pourrait être ton bloque de taille, tu le lis.
    Ca te coutera toujours moins cher que de revenir en arrière. Surtout que cette classe là, sauf si tu recommence le parsing ne revient pas en arrière.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/01/2010, 14h33
  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