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

AWT/Swing Java Discussion :

[SWING] Manipulation d'images


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Points : 34
    Points
    34
    Par défaut [SWING] Manipulation d'images
    Bonjour,

    Je travail sur des composants manipulants des images dont voici les grandes lignes du fonctionnement :

    ->Lire des images, au format JPEG ou PGM (PortableGrayMap) stockées sur le disque.

    ->Transformer les images lues en une chaine de caractères (String) permettant leur transit entre les composants (contrainte obligatoire).
    La chaine ne doit pas contenir les couleurs de chaques pixels comme pourrait fournir le getRGB(), mais la representation binaire de l'image.

    ->Decoder la chaine de caractère reçue pour recuperer une image affichable (Image ou BufferedImage)


    Voici les points qui me posent problème (en gros chaque étape ) :

    1 -> Comment lire une image au format PGM (le format n'est pas pris en compte par la librarie ImageIO et je ne peux pas utiliser de libraries autres que celles du JDK de base comme JAI qui aurait pû m'aider). Faut t'il obligatoirement que je developpe une classe permettant d'exploiter ce format ?

    2 -> Comment convertir d'une image JPEG ou PGM en chaine de caractères (String). Je n'ai pas trouvé de moyen de passer d'une BufferedImage lue via ImageIO.read() à un String. Je vais investiguer du côté des methodes de la classe ImageIO : createImageOutputStream() ou createImageInputStream() dont je n'ai pas encore compris le fonctionnement ou write(image, format, OutputStream) mais là je ne sais pas comment convertir le outputStream resultant en String. Si vous avez d'autres pistes n'hesitez pas

    3 -> Comment décoder une chaine de caractères contenant la representation binaire de l'image au format JPEG ou PGM pour aboutir à un objet affichable (Image ou BufferedImage). J'ai l'impression que les méthodes read(ImageInputStream) ou read(InputStream) de la classe ImageIO pourraient m'être utiles mais je ne voit pas comment passer de la chaine de caractère reçue à un flux exploitable par ces méthodes.

    Merci d'avance pour votre aide

    M@tth
    The first Rule of the fight Club is , you don't talk about fight club ...

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Juste qq idees comme ca :

    1) tu as repondu toi-meme a ta question, si tun'as pas la possibilite d'utiliser de lib externes et si ce n'est pas supporter par le JDK alors tu dois coder ca toi-meme.

    Non que le format PGM soit tres complique en lui-meme. Voir http://www.wotsit.org/search.asp?page=6&s=graphics. En plus le PGM c'est du texte (encore plus facile pour la conversion en chaine de char).

    2) plutot que de lire l'image via ImageIO et de convertir la bitmap en chaine de char, n'est'il pas tout simplement beaucoup plus facile de mettre le contenu binaire du fichier dans une chaine de char.

    3) dans ce cas la tout ce que tu aurai a faire c'est mettre la chaine de char (le contenu binaire du fichier) dans un fichier temporaire ou un flux et de faire lire la bitmap par ImageIO (JPEG) ou ta lib (PGM).
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Points : 34
    Points
    34
    Par défaut
    merci bouye ,

    En effet c'est sur le developpement de mon propre reader du format PGM que je m'étais orienté.

    Je suis d'accord avec ta proposition, mais peut tu être plus precis sur cette conversion du fichier binaire (via le inputStream je suppose) en String ?

    La aussi, n'étant pas familier avec la manipulation des flux, peux tu m'indiquer comment revenir de mon String à un flux qui sera passé en argument de mes constructeurs d'image (via ImageIO pour JPEG ou mon reader pour PGM)

    M@tth
    The first Rule of the fight Club is , you don't talk about fight club ...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Points : 34
    Points
    34
    Par défaut
    Voici les solutions que j'ai essayé :

    2 -> Récupration d'une image et transformation en String

    Recuperation de l'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InputStream fileStream = FileInputStream(imageName);
    Transformation en String : 3 solutions testées

    a/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BufferedReader in = new BufferedReader(new InputStreamReader(fileStream));			
    StringBuffer buffer = new StringBuffer();			
    String line = null;			
    while((line = in.readLine()) != null) {buffer.append(line);}			
    String rawData = buffer.toString();
    b/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BufferedReader in = new BufferedReader(new InputStreamReader(fileStream));
    char[] array = new char[fileStream.available()];
    int bytesNb = in.read(array);
    String rawData = new String(array);
    c/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    byte[] bytes = new byte [fileStream.available()];
    fileStream.read(bytes);
    String rawData = new String(bytes);
    3 -> Convesrion inverse de la chaine de caractères vers une image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ByteArrayOutputStream array = new ByteArrayOutputStream();	
    array.write(rawData.getBytes());			
    BufferedImage image = ImageIO.read(new ByteArrayInputStream(out.toByteArray())); /* POUR JPEG */
    PROBLEMES

    Si je choisi la solution a/ lors de la transformation de l'image en String j'obtient des erreurs lors de la phase de conversion inverse (erreurs differentes selon les images que je teste) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    javax.imageio.IIOException: Bogus Huffman table definition
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(Unknown Source)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(Unknown Source)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(Unknown Source)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(Unknown Source)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source)
    	at javax.imageio.ImageIO.read(Unknown Source)
    	at javax.imageio.ImageIO.read(Unknown Source)
    	at graphicalDataManagement.imageManagement.ImageComputing.rawToImage(ImageComputing.java:270)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     javax.imageio.IIOException: Invalid JPEG file structure: two SOI markers
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(Unknown Source)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(Unknown Source)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(Unknown Source)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(Unknown Source)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source)
    	at javax.imageio.ImageIO.read(Unknown Source)
    	at javax.imageio.ImageIO.read(Unknown Source)
    	at graphicalDataManagement.imageManagement.ImageComputing.rawToImage(ImageComputing.java:270)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     javax.imageio.IIOException: Quantization table 0x01 was not defined
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)
    	at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source)
    	at javax.imageio.ImageIO.read(Unknown Source)
    	at javax.imageio.ImageIO.read(Unknown Source)
    	at graphicalDataManagement.imageManagement.ImageComputing.rawToImage(ImageComputing.java:270)
    Si je choisi les solutions b/ ou c/ j'obtient l'affichage d'une image, mais celle-ci n'a rien à voir avec l'image d'origine. Elle n'a aucun sens, comme si les couleurs avaient été gérénérées aléatoirement.


    Si vous avez des solutions à mes problèmes, n'hesitez pas ;-)

    M@tth
    The first Rule of the fight Club is , you don't talk about fight club ...

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Bon déjà pour la lecture+transfert ces 2 méthodes suffisent largement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      public static byte[] readFile(File file) throws IOException {
        FileInputStream fileStream = new FileInputStream(file);
        byte[] bytes = new byte[fileStream.available()];
        fileStream.read(bytes);
        return bytes;
      }
     
      public static BufferedImage createImage(byte[] bytes) throws IOException {
        BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));
        return image;
      }
    Note que perso je ne me fierai pas trop à la taille retournée par available() d'après la doc (tandis que file.length() retourne la taille du fichier) et que je vérifierai aussi la taille lue retournée par read().
    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
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ensuite ces méthodes fonctionneront si tu tiens vraiment mais vraiment à stocker ton image dans une String (ce qui est une mauvaise idee en soit, mieux vaut garder le tableau d'octets) :

    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
     
      public static String fromBytesToString(byte[] bytes) {
        char[] chars = new char[bytes.length];
        for (int i = 0; i < chars.length; i++) {
          chars[i] = (char) bytes[i];
        }
        String result = new String(chars);
        /// BAD!!!!!!!!!!!!!!!
        //String result = new String(bytes);
        return result;
      }
     
      public static byte[] fromStringToBytes(String s) {
        byte[] result = new byte[s.length()];
        for (int i = 0; i < result.length; i++) {
          char c = s.charAt(i);
          result[i] = (byte) c;
        }
        /// BAD!!!!!!!!!!!!!!!
        //byte[] result = s.getBytes();
        return result;
      }
    Tu as oublié que les chaine sont des tableau de char qui utilisent un encodage particulier lors de la conversion byte => char (à la création) et char => byte (le getBytes()). En utilisant cette méthode qui je croise les doigts marche partout (mais je n'en suis pas sur) je ne travaille que sur le tableau de char, donc pas de pb d'encodage.

    Donc les donnée étaient modifiées 2 fois et on ne retrouvait pas le même tableau qu'à l'origine : même taille mais différence dans les valeurs contenues (hum mais faut penser à faire plus de tests quand même de temps à autres pour déterminer d'où vient l'erreur avant d'appeler au secours).

    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
     
      public static void main(String[] args) {
        try {
          byte[] bytes1 = readFile(new File("19.jpg"));
          String toto = fromBytesToString(bytes1);
          byte[] bytes2 = fromStringToBytes(toto);
          if (bytes1.length != bytes2.length) {
            throw new Exception("Note same size : " + bytes1.length + " vs. " +
                                bytes2.length);
          }
          for (int i = 0; i < bytes1.length; i++) {
            if (bytes1[i] != bytes2[i]) {
              throw new Exception("Error at " + i);
            }
          }
          BufferedImage image = createImage(bytes2);
          JLabel label = new JLabel(new ImageIcon(image));
          JFrame frame = new JFrame();
          frame.add(label);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.pack();
          frame.setVisible(true);
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
    En faisant des tests on remarquera que si on on réactive l'une ou l'autre des lignes commentées (ou les 2) ça plante (sur mon image test ça plantait en tout cas).
    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

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 31
    Points : 34
    Points
    34
    Par défaut
    Merci Bouye, pour les réponses et les tips.

    Mes composants fonctionnement nickel.

    M@tth
    The first Rule of the fight Club is , you don't talk about fight club ...

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

Discussions similaires

  1. [swing] Boutons et images
    Par mavina dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 17/02/2006, 18h07
  2. [VBA-E]Manipuler des images
    Par nils.angot dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 14/02/2006, 10h59
  3. [Swing] récupérer une image d'un composant
    Par klemouf dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 16/09/2004, 10h24
  4. [SDL] manipulation d'image
    Par zdra dans le forum OpenGL
    Réponses: 4
    Dernier message: 28/02/2004, 16h56

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