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

avec Java Discussion :

Récupérer une image RGB à partir d'une suite de bits


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 51
    Points : 28
    Points
    28
    Par défaut Récupérer une image RGB à partir d'une suite de bits
    Bonjour,

    j'ai réussit à convertir une image en une image RGB et puis en une suite de bit (des 0 et des 1).
    Maintenant, je veux faire le processus inverse, depuis une suite de bit, obtenir une image RGB et puis l'image principale.
    veuillez me donner un coup de main (un tuto, un bout de code..) et je serais très reconnaissante.
    Merci

  2. #2
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Va voir ici cela pourrait peut-être t'être utile !

    Si tu as un tableau de bits, tu peux aisément le transformer en tableau de byte (un byte est une successions de 8 bits) et ensuite reconvertir l'image.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 51
    Points : 28
    Points
    28
    Par défaut
    merci pour votre réponse Dark_TeToN,

    mais, ça n'a pas résolu le problème.
    en fait, recherche faites , j'ai abouti à ce bout de code
    :
    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
    19
    try{
                    ByteArrayInputStream bis = new ByteArrayInputStream(byt);
                    Iterator<?> readers = ImageIO.getImageReadersByFormatName("jpg");             
                    ImageReader reader = (ImageReader) readers.next();
                    Object source = bis; 
                    ImageInputStream iis = ImageIO.createImageInputStream(source);
                    reader.setInput(iis, true);
                    ImageReadParam param = reader.getDefaultReadParam();
                    Image img = reader.read(0, param);
                    BufferedImage bufferedImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
                    //bufferedImage is the RenderedImage to be written
                    Graphics2D g2 = bufferedImage.createGraphics();
                    g2.drawImage(img, null, null);
                    File imageFile = new File("C:\\newrose2.jpg");
                    ImageIO.write(bufferedImage, "gif", imageFile);
                    System.out.println(imageFile.getPath());
                    }
                    catch(Exception expt)
                    {System.out.println("\nc'est ici l'erreur"+expt.getMessage());}
    mais malheureusement on m'affiche cette erreur
    c'est ici l'erreurNot a JPEG file: starts with 0x6a 0x61
    je mets à votre disposition le code qui m'a permis de convertir les bits en byte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String str=in.toString();
                    byte[] byt=str.getBytes();
                    try{
                        for(int k=0;k<byt.length;k++)
                        System.out.print(byt[k]+"\t");
                    }
                    catch(Exception exp)
                    {System.out.println("\nici l'errur"+exp.getMessage());}
    et ça marche parfaitement
    je vous remercie en avance

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 51
    Points : 28
    Points
    28
    Par défaut
    veuillez me corriger le premier bout de code svp.
    merci

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par b_imen Voir le message
    c'est ici l'erreurNot a JPEG file: starts with 0x6a 0x61
    En même temps, ce code sert à lire une image JPEG. Si tes données ne sont pas une image JPEG, ça ne risque pas de marcher.

    Le truc, c'est qu'on ne sait pas précisément ce que c'est, tes données. Tu dis que ce sont "une suite de bits". Alors déjà il n'y a pas de type "suite de bits" en Java, alors on ne risque pas de deviner de quoi tu parles.
    Ensuite, cette suite de bits est issue de la conversion d'une "image RGB". Mais encore ? Il y a une infinité de façons de représenter une image RGB, ça ne nous dit pas laquelle.

    On ne peut pas t'aider si tu ne nous parles pas de ton problème.

    Citation Envoyé par b_imen Voir le message
    veuillez me corriger le premier bout de code svp.
    Il n'y a rien à corriger, ce n'est probablement pas la bonne méthode.
    Mais on ne peut pas connaître quelle est la bonne méthode tant que tu ne nous as pas parlé du problème.

    Citation Envoyé par b_imen Voir le message
    je mets à votre disposition le code qui m'a permis de convertir les bits en byte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String str=in.toString();
                    byte[] byt=str.getBytes();
                    try{
                        for(int k=0;k<byt.length;k++)
                        System.out.print(byt[k]+"\t");
                    }
                    catch(Exception exp)
                    {System.out.println("\nici l'errur"+exp.getMessage());}
    et ça marche parfaitement
    Ça m'étonnerait que ça marche, ni parfaitement, ni un peu. Tu dis que ça marche, mais tu ne nous dis pas pourquoi tu crois ça.
    Bon, c'est pas complètement impossible, après tout on ne connaît ni le type, ni le contenu de la variable in.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageIO.write(bufferedImage, "gif", imageFile);
    Tu ouvres une image encodée en JPG... et tu écris en GIF ?
    Qu'est-ce que tu souhaites faire de A à Z ? Difficile de t'aider plus...

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 51
    Points : 28
    Points
    28
    Par défaut
    Bonjour Dark_TeToN,
    mon travail consiste en l'envoi d'une image via socket depuis serveur vers client.
    pour se faire, il faut convertir mon image initiale en image RGB et puis vers un tableau de bit pour qu'il soit envoyé via socket (puisque aucun type de donnée puisse véhiculer via socket sauf les données binaire "des 0 et 1").
    c'est fait et j'ai réussit à envoyer mon image sous format binaire et le client les reçoit.
    je veux mnt récupérer mon image depuis cette suite de bit que le client reçoit.
    ce que je fait tout d'abord est de convertir la suite de bits en un byte array.
    et c'est à l'aide de ce bout de code que je le fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String str=in.toString();
                    byte[] byt=str.getBytes();
                    try{
                        for(int k=0;k<byt.length;k++)
                        System.out.print(byt[k]+"\t");
                    }
                    catch(Exception exp)
                    {System.out.println("\nici l'errur"+exp.getMessage());}
    puis, à partir de ce bytearray, je reconstruit mon image.
    voila, c'est le demandé. j'espère être claire.
    merci pour votre aide

  8. #8
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour écrire sur la socket il suffit de faire un ImageIO.write sur l'OutputStream de celle ci...

    Pas besoin de s'emmerder avec tout le reste et les tableaux de Bytes...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Image im = ImageIO.read(new File("/path/to/my/image.png"); 
    int port = 123456;
    ImageIO.write(im,"jpg",maSocket.getOutputStream());
    Fini (enfin faut fermer la socket nettoyer les ressources & cie bien sûr)
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 51
    Points : 28
    Points
    28
    Par défaut
    salut,
    je vous remercie pour votre réponse sinok,
    j'utilise votre bout de code, mais il devient souligné en rouge et on m'écrit cela
    no suitable method found for write(java.awt.Image,java.lang.String,java.io.OutputStream)
    method javax.imageio.ImageIO.write(java.awt.image.RenderedImage,java.lang.String,java.io.OutputStream) is not applicable
    (actual argument java.awt.Image cannot be converted to java.awt.image.RenderedImage by method invocation conversion)
    method javax.imageio.ImageIO.write(java.awt.image.RenderedImage,java.lang.String,java.io.File) is not applicable
    (actual argument java.awt.Image cannot be converted to java.awt.image.RenderedImage by method invocation conversion)
    method javax.imageio.ImageIO.write(java.awt.image.RenderedImage,java.lang.String,javax.imageio.stream.ImageOutputStream) is not applicable
    (actual argument java.awt.Image cannot be converted to java.awt.image.RenderedImage by method invocation conversion)

  10. #10
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    My bad...

    Il faut utiliser BufferedImage pour im et non Image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BufferedImage im = ImageIO.read(new File("/path/to/my/image.png");
    ImageIO.write(im,"jpg",maSocket.getOutputStream());
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 51
    Points : 28
    Points
    28
    Par défaut
    je vous remercie les pro pour votre aide, j'ai enfin résolu le problème à l'aide du bout de code que sinok m'a proposé, j'ai fixé l'erreur par changer le type de mon image de Image à BufferedImage .
    et ça marche , elle est envoyé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Socket soc;
    ServerSocket ss;
    BufferedImage image ;
     
    soc = ss.accept();
    image = ImageIO.read(new File("C://Documents and Settings/Administrateur.IMEN/Mes documents/NetBeansProjects/essai/src/essai/kid.jpg"));
    ImageIO.write(image,"jpg",soc.getOutputStream());
    merci à vous

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

Discussions similaires

  1. [Python 3.X] Créer une image png à partir d'une image de format quelconque avec Python
    Par bguy4 dans le forum Général Python
    Réponses: 3
    Dernier message: 30/10/2014, 10h49
  2. Réponses: 1
    Dernier message: 11/01/2012, 18h21
  3. Récupérer une image JPEG à partir d'une vidéo
    Par kurul1 dans le forum C++Builder
    Réponses: 8
    Dernier message: 09/08/2006, 10h51
  4. Réponses: 13
    Dernier message: 23/06/2006, 12h12
  5. Poids d'une image a partir d'une url
    Par matique dans le forum Langage
    Réponses: 4
    Dernier message: 11/02/2006, 20h41

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