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

Entrée/Sortie Java Discussion :

ImageIO


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Par défaut ImageIO
    C'est encore moi!
    grace a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    javax.imageio.ImageIO.write(bufferedImage,"png",baos);
    byte be[] = baos.toByteArray();
    j'envoi ce super tableau a mon client.

    Mais pour l'ante-traitement, mon client utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ByteArrayInputStream bais = null;
    bais = new ByteArrayInputStream(byteArray);
    bais.read();
    bi=ImageIO.read(bais);
    bi.getGraphics().drawImage(image,0,0,null);
    ce qui semble ne pas donner d'image.
    Est-ce que je m'y prend correctement?

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 902
    Billets dans le blog
    54
    Par défaut
    Mais à quoi servent donc le bais.read() ainsi que la dernière ligne ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre confirmé Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Par défaut
    bais.read():
    byteArray est un simple tableau dimensionné qui ne contient aucune données avant cette méthode.
    Cette méthode, je suppose, devrait permette de récupérer la chaïne de byte.
    Enfin j'y connais pas grand chose non plus.
    Si tu veux, j'ai un objet InputStream qui povient de ma socket. et comme je vais pas m'amuser a recréer des nouveau objets ByteArrayInputStream, je pense qu'il s'agit de la manière à procéder.
    N.B.: Il s'agit d'une appli qui est chargée de récupérer des données byte[] (créé à partir de 'java.lang.Image's sur un serveur) et de les afficher comme si toutes les images à la suite faisaient une vidéo.

    la derniere ligne:
    Bien que BufferedImage hérite de Image, apparement pour transformer un bufferedImage en Image, il faut s'y prendre ainsi.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 902
    Billets dans le blog
    54
    Par défaut
    Tu viens effectivement d'enlever 1 octet du flux... faut pas s'étonner si ImageIO n'arrive pas à lire l'image après.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bi.getGraphics().drawImage(image,0,0,null);
    Tu écrase l'image que tu viens de lire par... une autre, sortie d'on ne sait où...

    Non ma question est : qu'est ce que ces 2 lignes font là ?
    ENLEVE-LES !
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 902
    Billets dans le blog
    54
    Par défaut
    A aucun moment dans ton code tu ne met qq chose dans ton tableau de bytes.

    Si tu veux, j'ai un objet InputStream qui povient de ma socket. et comme je vais pas m'amuser a recréer des nouveau objets ByteArrayInputStream, je pense qu'il s'agit de la manière à procéder.
    Alors, si tu as effectivement un flux d'entré branché sur ta socket => passe directement ce flux-là en paramètre de ImagIO.

    Bien que BufferedImage hérite de Image, apparement pour transformer un bufferedImage en Image, il faut s'y prendre ainsi.
    Non !
    Non !
    Non !
    Et non !

    => revoir les cours de programmation objet, chapitre héritage : une java.awt.image.BufferedImage est une java.awt.Image - point barre.

    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre confirmé Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Par défaut
    OK!
    Je vais tester ca ce soir chez moi, en espérant que ca fonctionne comme tu dis.
    Mais en admettant que je passe en argument a la methode de ImageIO, mon InputStream (qui est relié à ma socket), penses-tu que la méthode aille prendre en compte le tableau de byte? Par la je veux dire que la méthode read() de l'InputStream sera automatique appelée + ou - directement.

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 902
    Billets dans le blog
    54
    Par défaut
    On peut en effet supposer que la methode read() sera appellee (plusieurs fois) tant que le flux/socket* contient des donnees, puisque c'est la methode de base pour lire le contenu d'un flux...



    * J'imagine que tu utilises le flux retourne par socket.getInputStream() ?

    Sinon (si marche pas/trop lent) : manuellement lire la socket, mettre le contenu dans le tableau, mettre le tableau dans un ByteArrayImputStream (qui n'est qu'une classe wrapper autour du tableau), utiliser ImageIO sur ce flux... Enfin bref tu connais la suite.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre confirmé Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Par défaut
    OK, ca marche pas hi hi!

    Voila le test que j'ai fait:
    j'ai d'abord zapé la socket pour voir si tout marchait localement: eh bien non.

    j'ai une classe A qui se charge du processing Image->byte[]
    et une classe B héritant de JFrame qui se charge de l'ante-processing et qui affiche l'image

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    class A extends Thread
    {
      B objetB;
      byte ba[];
     
      public A()
      {
         objetB = new B();
      }
     
      public void run()
      {
         while(true)
         {
           //processing
           ....
           objetB.setByte(ba);
         }
      }
    }
     
    class B extends JFrame
    {
      Image im;
     
      public B()
      {
         //parametre de la fenetre
         //initialisation des variables
      }
     
      public void setByte(byte b[])
      {
         //ante-processing
         im = ...
         repaint();
      }
     
      public void paint(Graphics g)
      {
         g.drawImage(im,0,0,this);
      }
    }
    bref, ca marche pas lol.
    Any Idea?

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 902
    Billets dans le blog
    54
    Par défaut
    Bizarrement chez moi (et hors socket) ça marche :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    package test;
     
    import java.awt.*;
    import java.awt.image.*;
    import java.io.*;
    import javax.imageio.*;
    import javax.swing.*;
     
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2005</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */
    class Test {
      public static void main(String[] args) throws Exception {
        // On obtient l'image d'une manière ou d'une autre.
        File file = new File("gw055.jpg");
        BufferedImage sourceImage = ImageIO.read(file);
        // On sauvegarde l'image dans un format compressé mais non-destructif.
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ImageIO.write(sourceImage, "png", out);
        // Qui sera stocké dans un tableau.
        byte[] bytes = out.toByteArray();
     
        ///////////////////////////////////////////////
        // Côté serveur, ici emmettre le fichier.    //
        ///////////////////////////////////////////////
        // Côté client une fois le tableau récupéré. //
        ///////////////////////////////////////////////
     
        // On le met dans un flux
        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
        // Et on lit l'image.
        BufferedImage destinationImage = ImageIO.read(in);
     
        // Tant qu'à faire on affiche les 2 images pour les comparer.
        JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(new ImagePanel(sourceImage)), new JScrollPane(new ImagePanel(destinationImage)));
        JFrame frame = new JFrame("Serveur / Client");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(split, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
        split.setDividerLocation(0.5);
      }
    }
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    package test;
     
    import java.awt.*;
    import java.beans.*;
    import javax.swing.*;
     
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2005</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */
    public final class ImagePanel extends JPanel {
      public static final String IMAGE_PROPERTY = "ImagePanel.image";
      private InnerListener innerListener = new InnerListener();
     
      public ImagePanel(Image image) {
        super();
        addPropertyChangeListener(IMAGE_PROPERTY, innerListener);
        setImage(image);
      }
     
      public void dispose() {
        removePropertyChangeListener(IMAGE_PROPERTY, innerListener);
        innerListener = null;
        setImage(null);
      }
     
      public void setImage(Image image) {
        putClientProperty(IMAGE_PROPERTY, image);
      }
     
      public Image getImage() {
        return (Image) getClientProperty(IMAGE_PROPERTY);
      }
     
      /** {@inheritDoc}
       */
      @Override protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        Image image = getImage();
        if (image != null) {
          graphics.drawImage(image, 0, 0, null);
        }
      }
     
      /**
       * <p>Title: </p>
       * <p>Description: </p>
       * <p>Copyright: Copyright (c) 2005</p>
       * <p>Company: </p>
       * @author not attributable
       * @version 1.0
       */
      private class InnerListener implements PropertyChangeListener {
        /** {@inheritDoc}
         */
        public void propertyChange(PropertyChangeEvent event) {
          String property = event.getPropertyName();
          if (property.equals(IMAGE_PROPERTY)) {
            Image image = getImage();
            int width = 0;
            int height = 0;
            if (image != null) {
              width = image.getWidth(null);
              height = image.getHeight(null);
            }
            Dimension size = new Dimension(width, height);
            setPreferredSize(size);
            setMinimumSize(size);
            repaint();
          }
        }
      }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 902
    Billets dans le blog
    54
    Par défaut
    Ca aussi tant qu'à faire :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
     public static void main(String[] args) throws Exception {
        testServer();
        testClient();
      }
     
      public static void testServer() throws Exception {
        // On obtient l'image d'une manière ou d'une autre.
        File file = new File("gw055.jpg");
        BufferedImage sourceImage = ImageIO.read(file);
        // On sauvegarde l'image dans un format compressé mais non-destructif.
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ImageIO.write(sourceImage, "png", out);
        // Qui sera stocké dans un tableau.
        final byte[] bytes = out.toByteArray();
        // On emmet le tableau.
        final ServerSocket socket = new ServerSocket(45001);
        Thread t = new Thread(new Runnable() {
          public void run() {
            try {
              while (true) {
                Socket client = socket.accept();
                OutputStream socketOut = client.getOutputStream();
                socketOut.write(bytes);
              }
            } catch (Throwable t) {
              t.printStackTrace();
            }
          }
        });
        t.start();
      }
     
      public static void testClient() throws Exception {
        // On récupère le flux venant du serveur.
        Socket socket = new Socket("localhost", 45001);
        InputStream in = socket.getInputStream();
        // Et on lit l'image.
        BufferedImage destinationImage = ImageIO.read(in);
     
        // Tant qu'à faire on affiche l'image pour vérifier le résultat.
        JFrame frame = new JFrame("Client");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(new JScrollPane(new ImagePanel(destinationImage)), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
      }
    }
    Evidement tous ces codes de tests sont vite faits mal faits avec aucun test supplémentaire pour vérifier que tout est bien lut/ecrit/envoyé, fait dans le bon ordre, gestion d'erreur, ............
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Membre confirmé Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Par défaut
    eh bien, le moins qu'on puisse dire c'est que je dois etre bien naz lol
    enfin, si ca marche chez toi, y'a aucune raison pour que ca marche pas chez moi!
    J'ai pas encore test ton code, mais je vais le faire de ce pas.
    Un vrai exemple avec du code sympathique, c'est vraiment génial.
    Merci beaucoup, je vais pouvoir afficher les images de ma webcam sur des applet sans que les clients aient besoin de JMF.
    Vive les servlets et ton code.

    Thx

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/12/2006, 00h40
  2. Problème avec ImageIO
    Par DjPoke dans le forum Langage
    Réponses: 2
    Dernier message: 09/11/2006, 18h21
  3. ImageIO.read dans un EDI
    Par MasterGreg dans le forum EDI et Outils pour Java
    Réponses: 3
    Dernier message: 01/09/2006, 23h21
  4. ImageIO.write prob suivant le format
    Par nicotine002 dans le forum Multimédia
    Réponses: 3
    Dernier message: 06/07/2006, 11h43
  5. Réponses: 2
    Dernier message: 13/12/2004, 23h32

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