Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 17 sur 17
  1. #1
    Membre à l'essai
    Inscrit en
    novembre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 61
    Points : 24
    Points
    24

    Par défaut convertir tableau de byte en String

    Bonjour je suis nouveau sur le forum ( bien que je le consulte depuis 3 ans pour trouver des idées).

    Je suis sur un projet scolaire ( en master informatique).
    Mon problème est le suivant:
    1. j'ai une image sur le disque que je recupère en tableau de byte (fait)
    2. je veux maintenant transformer ce tableau de byte en tableau String , pour que plus tard je reprenne ce tableau de String et le convertis en tableau de byte afin de reconsituer l'image ( non fait)


    Ma première question est comment convertir un byte [] en String [] (je veux que ce String[] contienne ce qui s'affiche quand on affiche le contenu du byte[] via System.out.println() ).
    Ma seconde question est de savoir comment récuperer l'entete du fichier image via ce tableau de byte (entete qui contient la taille, le type, etc...)

    J'espère avoir été au maximum clair, sinon n'hesitez pas à me le faire savoir.

    Merci

  2. #2
    Expert Confirmé
    Avatar de ®om
    Inscrit en
    janvier 2005
    Messages
    2 812
    Détails du profil
    Informations forums :
    Inscription : janvier 2005
    Messages : 2 812
    Points : 3 091
    Points
    3 091

    Par défaut

    Citation Envoyé par geek21 Voir le message
    [*]je veux maintenant transformer ce tableau de byte en tableau String , pour que plus tard je reprenne ce tableau de String et le convertis en tableau de byte afin de reconsituer l'image ( non fait)
    Tu l'as en byte[] et quand tu voudras le récupérer tu le voudras en byte[]. Pourquoi tu veux passer par un String (ce qui d'ailleurs n'aurait aucun sens pour une image)?

  3. #3
    Membre confirmé Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2005
    Messages : 245
    Points : 297
    Points
    297

    Par défaut

    Salut

    Citation Envoyé par ®om Voir le message
    Tu l'as en byte[] et quand tu voudras le récupérer tu le voudras en byte[]. Pourquoi tu veux passer par un String (ce qui d'ailleurs n'aurait aucun sens pour une image)?
    Oui évidemment.

    Pour l'entete, tu peux le lire directement du fichier et n'arranger dans le tableau byte que les données utiles de l'image.
    L'entete differe d'un format a l'autre, par exmple pour un fichier bmp:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    RandomAccessFile imgFile = new RandomAccessFile(imgName,"rw");
     
    String id = "" + (char)imgFile.readByte() + (char) imgFile.readByte();
    System.out.println("Identifier: " + id ); // doit afficher BM
     
    int fileSize = Integer.reverseBytes(imgFile.readInt());
     // car les 4 octets sont inversés dans le fichier.
    System.out.println("FileSize: " + fileSize);
     
    .......
    A toi de jouer.

  4. #4
    Membre à l'essai
    Inscrit en
    novembre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 61
    Points : 24
    Points
    24

    Par défaut

    Citation Envoyé par ®om Voir le message
    Tu l'as en byte[] et quand tu voudras le récupérer tu le voudras en byte[]. Pourquoi tu veux passer par un String (ce qui d'ailleurs n'aurait aucun sens pour une image)?
    En faite j'ai besoin de la passer en String afin de pouvoir coder manuelement le contenu du tableau de String (sauf l'entete que je souhaite isolée). Plus tard je decode ce tableau de String et le retransforme en tableau de byte.

    Donc ce que je cherche c'est comment passer du byte[] en String[] sans altérer le contenu du byte[].

    Amine_sas je vais m'empresser de tester cela.

    merci à vous

  5. #5
    Membre à l'essai
    Inscrit en
    novembre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 61
    Points : 24
    Points
    24

    Par défaut

    J'ai trouvé la solution pour mon premier problème.
    Je vous explique ce que j'ai fais pour que vous puissiez m'aider si possiblepour ma seconde question.
    Donc j'ai pris mon tableau byte[] TabByte (qui est rempli avec les bytes lus sur à partir d'une image). Par exemple l'affichage console de
    Code :
    1
    2
    3
     
    for(int i=0;i<TabByte.length;i++)
                System.out.print(TabByte[i]);
    me donne
    Code :
    1
    2
     
    -1-40-1-3201674707370011107207200-1
    Ensuite je prend TabByte et l'utilise de la façon suivante
    Code :
    1
    2
    3
    4
     
    String [] ByteEnString=new String[TabByte.length]
    for(int i=0;i<TabByte.length;i++)
                    ByteEnString[i]=String.valueOf(TabByte[i]);
    J'obtiens ainsi la représentation en String de TabByte et l'affichage suivant
    Code :
    1
    2
    3
     
    for(int i=0;i<ByeEnString.length;i++)
                System.out.print(ByteEnString[i]);
    me donne exactement la même chose que le première affichage,c'est-à-dire
    Code :
    1
    2
     
    -1-40-1-3201674707370011107207200-1
    Ma question maintenant est de savoir sur combien de byte l'entete de l'image est stocké (sur les 5 premiers? 10 premiers?).

    si quelqu'un maitrise les images en java....

  6. #6
    Membre confirmé Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2005
    Messages : 245
    Points : 297
    Points
    297

    Par défaut

    Citation Envoyé par geek21 Voir le message
    J'obtiens ainsi la représentation en String de TabByte et l'affichage suivant
    Code :
    1
    2
    3
     
    for(int i=0;i<ByeEnString.length;i++)
                System.out.print(ByteEnString[i]);
    me donne exactement la même chose que le première affichage,c'est-à-dire
    Code :
    1
    2
     
    -1-40-1-3201674707370011107207200-1
    .
    Toujours difficile de trouver une raison pour cette conversion, (peut etre tu nous l'avouera).

    Ma question maintenant est de savoir sur combien de byte l'entete de l'image est stocké (sur les 5 premiers? 10 premiers?).

    si quelqu'un maitrise les images en java....
    ça depend énormement du type de l'image, ça differe entre BMP, Gif, JPG ...etc. Par exemple l'entete du format bmp contient entre autre:
    - Un idetifiant sur 2 octets.
    - La taille du fichier sur 4 octets.
    - Puis, 4 octets réservés.
    - Dataoffset (L'adresse du premier octet des données utiles dans le fichier) sur 4 octets .
    ....
    Cherches su google pour en apprendre davantage.

    @+

  7. #7
    Membre à l'essai
    Inscrit en
    novembre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 61
    Points : 24
    Points
    24

    Par défaut

    Citation Envoyé par Amine_sas
    Toujours difficile de trouver une raison pour cette conversion, (peut etre tu nous l'avouera).
    Je fais cette conversion car j'ai besoin de manipuler les bytes de l'image. Mais cette manipulation ne peut se faire que sur des String, c'est pour cela que je convertis le byte [] en String[]. La manipulation consiste à appliquer tout d'abord la Transformée de Burrows-Wheeler, et ensuite appliquer le Move To Front ( une explication est fournie ici et ici) qui sont des techniques de préparation pour la compression de l'image.

    Je ne vais utiliser que des JPEG pour mon projet, car le principe est le même du moment qu'on connait la taille de l'entete.
    C'est difficile de trouver de la doc la dessus j'ai cherché mais je n'ai rien trouvé de complet, seulement des approximations.

    Merci quand même.

  8. #8
    Expert Confirmé
    Avatar de ®om
    Inscrit en
    janvier 2005
    Messages
    2 812
    Détails du profil
    Informations forums :
    Inscription : janvier 2005
    Messages : 2 812
    Points : 3 091
    Points
    3 091

    Par défaut

    Citation Envoyé par geek21 Voir le message
    Mais cette manipulation ne peut se faire que sur des String
    Ah, on m'aurait menti !

    Code :
    1
    2
    byte[] tab = { 12, 15, 27 };
    tab[0] = 13;
    Citation Envoyé par geek21 Voir le message
    c'est pour cela que je convertis le byte [] en String[].
    Mis à part que ça ne sert à rien, conceptuellement un String est un/manipule un byte[]. Donc un String[] c'est comme un byte[][]...

  9. #9
    Membre à l'essai
    Inscrit en
    novembre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 61
    Points : 24
    Points
    24

    Par défaut

    Citation Envoyé par ®om
    Ah, on m'aurait menti !

    Code :

    byte[] tab = { 12, 15, 27 };
    tab[0] = 13;

    Citation:
    Envoyé par geek21 Voir le message
    c'est pour cela que je convertis le byte [] en String[].
    Mis à part que ça ne sert à rien, conceptuellement un String est un/manipule un byte[]. Donc un String[] c'est comme un byte[][]...
    Mes fonctions MoveToFront et BurrowsWheeler s'appliquent à des String (c'est un choix personel), alors je prends la représentation en String des bytes pour utiliser ces fonctions sur une image. Où est le problème?

  10. #10
    Expert Confirmé
    Avatar de ®om
    Inscrit en
    janvier 2005
    Messages
    2 812
    Détails du profil
    Informations forums :
    Inscription : janvier 2005
    Messages : 2 812
    Points : 3 091
    Points
    3 091

    Par défaut

    Citation Envoyé par geek21 Voir le message
    Où est le problème?
    Le problème c'est qu'un String n'est pas fait pour stocker une image...
    Pourquoi ne pas utiliser int[] pour stocker des chaînes de caractères?

    Citation Envoyé par geek21 Voir le message
    Mes fonctions MoveToFront et BurrowsWheeler s'appliquent à des String (c'est un choix personel)
    Je serais toi, je reverrais mon choix personnel

    Bon courage.

  11. #11
    Membre à l'essai
    Inscrit en
    novembre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 61
    Points : 24
    Points
    24

    Par défaut

    Citation Envoyé par ®om
    Le problème c'est qu'un String n'est pas fait pour stocker une image...
    Pourquoi ne pas utiliser int[] pour stocker des chaînes de caractères?
    Je n'utilise pas un String pour stocker une image, je passe seulement par le String pour appliquer mes fonctions, ensuite je repasse le String[] en byte[].

    Citation Envoyé par ®om
    Je serais toi, je reverrais mon choix personnel
    Je suis mieux placé par rapport a mon sujet de projet pour savoir quel choix je dois faire (le même choix d'ailleur que l'ensemble de ma promotion). Après je peux te passer le sujet et tu peux refléchir à d'autres pistes (bien que je dirais que le sujet t'impose presque les choses)
    Personnelement si on était vraiment libre sur le sujet je n'aurais pas opté pour le passage par les String.
    ®om si tu as des info sur le nombre d'octet qu'occupe l'entete dans un fichier jpg je suis preneur, car je trouve rien de complet.

    Merci à vous

  12. #12
    Membre confirmé Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2005
    Messages : 245
    Points : 297
    Points
    297

    Par défaut

    Salut,

    Voir ce lien. Le tout est en anglais.

  13. #13
    Membre à l'essai
    Inscrit en
    novembre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 61
    Points : 24
    Points
    24

    Par défaut

    Merci Amine_sas. Sur ton liens j'ai trouvé une doc interessante et surtout complète sur les fichiers BMP. Je vais donc choisir ce type de fichier pour mon projet.

    Citation Envoyé par ®om
    Le problème c'est qu'un String n'est pas fait pour stocker une image...
    Pourquoi ne pas utiliser int[] pour stocker des chaînes de caractères?
    Qui a parlé de stocker une image dans un String? Tu n'as pas bien compris l'utilité du truc. De plus passer le fichier image sous forme de représentation en String est utile dans plusieur cas. En voila un

  14. #14
    Membre confirmé Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2005
    Messages : 245
    Points : 297
    Points
    297

    Par défaut

    Salut,
    Citation Envoyé par geek21 Voir le message
    De plus passer le fichier image sous forme de représentation en String est utile dans plusieur cas. En voila un
    Utilises donc la classe StringBuffer ou StringBuilder, elles sont plus rapide que String, notamment la derniere.

  15. #15
    Membre habitué
    Inscrit en
    décembre 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : décembre 2005
    Messages : 243
    Points : 110
    Points
    110

    Par défaut

    Salut,

    Je tiens à preciser Tu fais absolument ce que tu veux.

    Mais si j'ai bien compris ton problème, je serai plutot parti sur une representation de mon image par un tableau de int. Pour cela il y a les bufferedImage et avec eux il y a plus besion de prendre en compte le format de l'image (c'est le bufferedImage qui s'en occupe).

    De plus, il me semble qu'un byte a 255 valeurs soit 8 bits. Or une couleur en jpg est codé sur 4 bytes soit 32 bits.

    Si tu veux mettre les int de ton image en string voici comment je ferais :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BufferedImage bufferedImage;
    int tab[];
    String tabS[];
    try{
                bufferedImage = ImageIO.read(new File(fileName));
            }
            catch(IOException e){e.printStackTrace();}
    tab = new int[bufferedImage.getWidth()*bufferedImage.getHeight()];
    getRGB(0,0,bufferedImage.getWidth(),bufferedImage.getHeight(),tab,0,1);
    tabS = new String[tab.length()];
    for...
    tabS [] = new Integer(tab[]).toString();
    Il y a beauoup plus propre....
    J'espère que cela t'aidera...
    Bon courrage

  16. #16
    Membre à l'essai
    Inscrit en
    novembre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 61
    Points : 24
    Points
    24

    Par défaut

    Citation Envoyé par philippe13 Voir le message
    Salut,

    Je tiens à preciser Tu fais absolument ce que tu veux.

    Mais si j'ai bien compris ton problème, je serai plutot parti sur une representation de mon image par un tableau de int.
    Bonjour philippe13,
    si je pouvais faire ce que je voulais j'aurais opté pour les BuferredImage comme tu l'as proposé, mais je suis obligé de passer par une représentation en String de l'image! C'est le sujet qui impose implicitement cela. Pour ce qui est de passer par des int pour arriver au String, et bien j'ai trouvé plus court, c'est-à-dire passer directement du byte[] en String[].
    Ce soir je poste le code que j'ai concu car je suis enfin arrivé à avoir ce que je voulais.

  17. #17
    Membre à l'essai
    Inscrit en
    novembre 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 61
    Points : 24
    Points
    24

    Par défaut

    Donc voila ce que j'ai fait pour résoudre mon problème.

    Tout d'abord je récupère l'image BMP sur le disque dans un tableau de byte TabByte.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
            FileInputStream tmmp; /* Déclaration d'un FileInputStream */
            byte TabByte[] = new byte[(int)(ElementIni.length())]; /* Instanciation d'un tableau de byte de la taille du fichier */
            try
            {
                tmmp = new FileInputStream(ElementIni); /* Instanciation du FileInputStream sur le fichier */
                System.out.println(ElementIni.length() + " bytes dans le fichier d'entree");
                System.out.println(tmmp.read(TabByte) + " bytes lus dans le fichier"); /* Ecriture du contenu du fichier dans le tableau de bytes */
                System.out.println("Tableau cree");
     
            }
            catch(Exception e)
            {
                System.out.println("Tableau pas cree"); /* Bon, ben la ca a pas marché... */
                System.out.println(e.getMessage()); /* ... mais il dit quand meme pourquoi ... */
                TabByte = null;
            }
    J'extrais de TabByte les 54 premières cases qui representent l'entete de l'image (qui occupe les 54 premiers octets d'après ce que j'ai pu comprendre en m'informant sur la structure d'un fichier BMP,mais je ne suis pas encore certain). J'extrais aussi tout ce qu'il y a après les 54 premiers octets ( le reste représente donc les données proporement dites de l'image).
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    byte [] entete= new byte [54];
    for(int i=0;i<54;i++){
         entete[i]=TabByte[i];
    }
     
    byte [] donnees= new byte [TabByte.length-54];
    for(int i=0;i<(donnees.length-54);i++){
         donnees[i]=TabByte[i+54];
    }
    Je mets de côté le tableau entete.

    Maintenant je prends la représentation en String du tableau de byte donnees, par exemple le byte -1835 deviendra la chaine "-1835". (là était mon problème).
    Code :
    1
    2
    3
    4
    5
     
    String [] RepresentationEnChaine= new String[donnees.length];
    for(int i=0;i<donnees.length;i++){
          RepresentationEnChaine[i]=String.valueOf(donnees[i]);
    }

    Maintenant je peux appliquer mes fonctions BurrowsWheeler et MoveToFront à mon tableau de String RepresentationEnChaine (ces fonctions ne prennent en paramètre que des String, et je le redis QUE des String et ce n'est pas mon choix,d'où l'utilité d'avoir créer le tableau RepresentationEnString). Ces deux fonctions appliquent certains algorithmes pour coder et préparer l'image à la compression.

    Donc après avoir modifié RepresentationEnChaine, je reconvertis ce tableau de String en tableau de byte,par exemple RepresentationEnChaine[0] qui vaut "-4398" deviendra maintenant le byte -4398 (je fais l'opération inverse de tout à l'heure).
    Code :
    1
    2
    3
    4
    5
     
    byte [] ReconstitutionBinaire=new byte [RepresentationEnChaine.length];
    for(int i=0;i<RepresentationEnChaine.length;i++){
         ReconstitutionBinaire [i] = Byte.parseByte(RepresentationEnChaine[i]);
    }
    Enfin il ne manque plus qu'à assembler le tableau de byte entete de tout à l'heure avec ReconstitutionBinaire pour avoir un nouveau tableau de byte (que j'appelle TabByteFinal) contenant les bytes de l'image BMP de tout à l'heure, mais cette fois-ci dont le contenu a été modifié/codé (ou même crypté si l'on veut abuser du terme).
    Pour verifier que le contenu de l'image de depart diffère de celui de l'image final que l'on vient d'obtenir, il suffit de transformer TabByteFinal en fichier BMP en faisant comme suit
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            try
            {   
                // on spécifie le nom de fichier de sortie (qui va être creé par défaut dans le dossier du projet)
                FileOutputStream fileOut= new FileOutputStream("ImgModifiee.bmp");
                fileOut.write(TabByteFinal, 0, TabByteFinal.length);
            }
            catch (Exception e)
            {
                String err = e.toString();
                System.out.println(err);
            }
    Ce code a été testé entièrement et donc fonctionne correctement (moi j'ai inséré au milieu de ce code l'application de mes fonctions BurrowsWheeler et MoveToFront)

    Voila j'espère avoir été le plus clair et le plus précis possible et que cela servira à quelqu'un.

    Merci à tous

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •