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

2D Java Discussion :

Lecture d'images et icones au format x-icon


Sujet :

2D Java

  1. #1
    Membre confirmé Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2003
    Messages : 456
    Points : 482
    Points
    482
    Par défaut Lecture d'images et icones au format x-icon
    Bonjour,

    Je suis en train de faire un programme qui parse les bookmarks de Firefox.
    Pour l'instant, j'arrive à récupérer l'arborescence et les liens.

    J'aimerais maintenant pour chaque lien récupérer l'icone associé.
    Dans le fichier html les icones sont décrits comme ci-dessous (exemple de Google):
    Code bookmarks.html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <A HREF="http://www.google.fr/" ADD_DATE="1181252146" LAST_VISIT="1194318913" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8A//3/AP39/wD6/f8A+P3/AP/8/wD9/P8A+vz/AP/7/wD/+v8A/vr/APz6/wD4+v8A+/n/APP5/wD/+P8A+vj/AO/4/wDm+P8A2fj/AP/3/wD/9v8A9vb/AP/1/wD69f8A9PT/AO30/wD/8/8A//L/APnx/wD28P8A///+APj//gD2//4A9P/+AOP//gD//f4A6f/9AP///AD2//wA8//8APf9/AD///sA/v/7AOD/+wD/+vsA9/X7APr/+gDv/voA///5AP/9+QD/+/kA+e35AP//+ADm//gA4f/4AP/9+AD0+/gA///3APv/9wDz//cA8f/3AO3/9wD/8fcA//32AP369gDr+vYA8f/1AOv/9QD/+/UA///0APP/9ADq//QA///zAP/18wD///IA/fzyAP//8QD///AA9//wAPjw8AD//+8A8//vAP//7gD9/+4A9v/uAP/u7gD//+0A9v/tAP7/6wD/+eoA///pAP//6AD2/+gA//nnAP/45wD38eYA/fblAP/25AD29uQA7N/hAPzm4AD/690AEhjdAAAa3AAaJdsA//LXAC8g1gANH9YA+dnTAP/n0gDh5dIADyjSABkk0gAdH9EABxDRAP/l0AAAJs4AGRTOAPPczQAAKs0AIi7MAA4UywD56soA8tPKANTSygD/18kA6NLHAAAjxwDj28QA/s7CAP/1wQDw3r8A/9e8APrSrwDCtqoAzamjANmPiQDQj4YA35mBAOmefgDHj3wA1qR6AO+sbwDpmm8A2IVlAKmEYgCvaFoAvHNXAEq2VgA5s1UAPbhQAFWtTwBStU0ARbNNAEGxTQA7tEwAObZIAEq5RwDKdEYAULhDANtuQgBEtTwA1ls3ALhgMQCxNzEA2FsvAEC3LQB0MCkAiyYoANZTJwDLWyYAtjMlALE6JACZNSMAuW4iANlgIgDoWCEAylwgAMUuIAD3Vh8A52gdALRCHQCxWhwAsEkcALU4HACMOBwA0V4bAMYyGgCPJRoA218ZAJM7FwC/PxYA0msVAM9jFQD2XBUAqioVAIAfFQDhYRQAujMTAMUxEwCgLBMAnxIPAMsqDgCkFgsA6GMHALE2BAC9JQAAliIAAFYTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AsbGxsbGxsbGxsbGxsbGxd7IrMg8PDw8PDw8PUBQeJXjQYE9PcKPM2NfP2sWhcg+BzTE7dLjbmG03YWaV4JYye8MPbsLZlEouKRRCg9SXMoW/U53enGRAFzCRtNO7mTiAyliw30gRTg9VbJCKfYs0j9VmuscfLTFbIy8SOhA0Inq5Y77GNBMYIxQUJzM2Vxx2wEmfyCYWMRldXCg5MU0aicRUms58SUVeRkwjPBRSNIfBMkSgvWkyPxVHFIaMSx1/0S9nkq7WdWo1a43Jt2UqgtJERGJ5m6K8y92znpNWIYS1UQ89Mmg5cXNaX0EkGyyI3KSsp6mvpaqosaatq7axsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" LAST_CHARSET="UTF-8" ID="rdf:#$ZfUgS2">

    L'icone est donc au format image/x-icon.
    Et je n'ai aucune idée de comment créer une image de ce type en Java.
    Une fois l'image récupérée, je voudrais l'écrire dans un fichier png. Mais ça c'est un autre problème.

    Si vous avez une idée, je suis preneur.

    A+
    Gronono

    Edit suite au déplacement du message : je ne souhaite pas afficher l'icone mais uniquement créer un fichier png à partir de l'icone du favoris.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 854
    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 854
    Points : 22 876
    Points
    22 876
    Billets dans le blog
    51
    Par défaut
    Bon alors :
    - pour ecrire le PNG, la pas de probleme, il sufit d'utiliser ImageIO avec les bons parametres.

    - pour lire l'icone, apparement il faut passer la chaine a un decrypteur base 64 pour retrouver le flux binaire d'origine (ce qui peut etre fait vers un fichier temporaire).

    Reste que d'apres wikipedia le type MIME image/x-icon serait associe au format de fichier ICO de Microsoft bien que les icones de favoris puissent egalement etre au format GIF ou PNG. Il va donc te falloir trouver un codec permettant de lire des images a ce format ou dans le pire des cas te le coder toi-meme : Format ICO. Vu que ce n'est pas un format hyper-complique ca ne devrait pas etre impossible a faire.

  3. #3
    Membre confirmé Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2003
    Messages : 456
    Points : 482
    Points
    482
    Par défaut
    Bonjour,

    Merci de ta réponse. Finalement tu avais raison de déplacer mon post. A peine dans le nouveau forum et déjà une réponse .

    Je n'avais pas pensé à chercher dans wikipédia .

    Je regarde les articles donnés. Puis je vous tiens au courant.

    Encore merci

    A+
    Gronono

  4. #4
    Membre confirmé Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2003
    Messages : 456
    Points : 482
    Points
    482
    Par défaut
    Bonjour,

    Pour le décryptage, j'ai trouvé la classe sun.misc.BASE64Decoder fourni avec le JDK.

    Je n'ai pour l'instant pas le trop le temps d'essayer. Je pense m'y mettre sérieusement ce week-end.

    A+
    Gronono

  5. #5
    Membre confirmé Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2003
    Messages : 456
    Points : 482
    Points
    482
    Par défaut
    Bon, je viens d'avoir deux minutes au travail (pendant une longue compilation) pour faire un test.
    J'arrive maintenant à regénérer le fichier icone . Voici un extrait 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
     
    private static final String ICO = "AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8A//3/AP39/wD6/f8A+P3/AP/8/wD9/P8A+vz/AP/7/wD/+v8A/vr/APz6/wD4+v8A+/n/APP5/wD/+P8A+vj/AO/4/wDm+P8A2fj/AP/3/wD/9v8A9vb/AP/1/wD69f8A9PT/AO30/wD/8/8A//L/APnx/wD28P8A///+APj//gD2//4A9P/+AOP//gD//f4A6f/9AP///AD2//wA8//8APf9/AD///sA/v/7AOD/+wD/+vsA9/X7APr/+gDv/voA///5AP/9+QD/+/kA+e35AP//+ADm//gA4f/4AP/9+AD0+/gA///3APv/9wDz//cA8f/3AO3/9wD/8fcA//32AP369gDr+vYA8f/1AOv/9QD/+/UA///0APP/9ADq//QA///zAP/18wD///IA/fzyAP//8QD///AA9//wAPjw8AD//+8A8//vAP//7gD9/+4A9v/uAP/u7gD//+0A9v/tAP7/6wD/+eoA///pAP//6AD2/+gA//nnAP/45wD38eYA/fblAP/25AD29uQA7N/hAPzm4AD/690AEhjdAAAa3AAaJdsA//LXAC8g1gANH9YA+dnTAP/n0gDh5dIADyjSABkk0gAdH9EABxDRAP/l0AAAJs4AGRTOAPPczQAAKs0AIi7MAA4UywD56soA8tPKANTSygD/18kA6NLHAAAjxwDj28QA/s7CAP/1wQDw3r8A/9e8APrSrwDCtqoAzamjANmPiQDQj4YA35mBAOmefgDHj3wA1qR6AO+sbwDpmm8A2IVlAKmEYgCvaFoAvHNXAEq2VgA5s1UAPbhQAFWtTwBStU0ARbNNAEGxTQA7tEwAObZIAEq5RwDKdEYAULhDANtuQgBEtTwA1ls3ALhgMQCxNzEA2FsvAEC3LQB0MCkAiyYoANZTJwDLWyYAtjMlALE6JACZNSMAuW4iANlgIgDoWCEAylwgAMUuIAD3Vh8A52gdALRCHQCxWhwAsEkcALU4HACMOBwA0V4bAMYyGgCPJRoA218ZAJM7FwC/PxYA0msVAM9jFQD2XBUAqioVAIAfFQDhYRQAujMTAMUxEwCgLBMAnxIPAMsqDgCkFgsA6GMHALE2BAC9JQAAliIAAFYTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AsbGxsbGxsbGxsbGxsbGxd7IrMg8PDw8PDw8PUBQeJXjQYE9PcKPM2NfP2sWhcg+BzTE7dLjbmG03YWaV4JYye8MPbsLZlEouKRRCg9SXMoW/U53enGRAFzCRtNO7mTiAyliw30gRTg9VbJCKfYs0j9VmuscfLTFbIy8SOhA0Inq5Y77GNBMYIxQUJzM2Vxx2wEmfyCYWMRldXCg5MU0aicRUms58SUVeRkwjPBRSNIfBMkSgvWkyPxVHFIaMSx1/0S9nkq7WdWo1a43Jt2UqgtJERGJ5m6K8y92znpNWIYS1UQ89Mmg5cXNaX0EkGyyI3KSsp6mvpaqosaatq7axsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
     
    	public static void main(final String[] args) throws IOException {
    		final BASE64Decoder decoder = new BASE64Decoder();
    		final byte[] decode = decoder.decodeBuffer(ICO);
     
    		final OutputStream stream = new FileOutputStream("google.ico");
    		try {
    			stream.write(decode);
    		} finally {
    			stream.close();
    		}
    		System.out.println("Fichier écrit");
    	}
    ICO contient le texte de l'icone pour google contenu dans le fichier bookmark.html.

    Il me reste encore à convertir l'icone en png.

    A+
    Gronono

  6. #6
    Membre confirmé Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2003
    Messages : 456
    Points : 482
    Points
    482
    Par défaut
    Apparrament, il y a image4j pour manipuler les ICO.

    Je vais tester ça.

    A+
    Gronono

  7. #7
    Membre confirmé Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2003
    Messages : 456
    Points : 482
    Points
    482
    Par défaut
    Bon finallement, j'ai pris le temps

    Donc je résume la solution :

    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
     
    public static void createBookmarkIcon(final String base64Ico, final String outFile) throws IOException {
      final BASE64Decoder decoder = new BASE64Decoder();
      final byte[] buffer = decoder.decodeBuffer(base64Ico);
      final ByteArrayInputStream is = new ByteArrayInputStream(buffer);
      try {
        final List<BufferedImage> images = ICODecoder.read(is);
        if (images.isEmpty()) {
          throw new IOException("No icon image found");
        }
        final BufferedImage image = images.get(0);
        final PngImage pngImage = new PngImage(image);
        pngImage.write(outFile);
      } finally {
        is.close();
      }
    }
    La classe BASE64Decoder est fourni par le package sun.misc disponible en standard.
    La classe ICODecoder est fourni par image4j.
    La classe PngImage est une classe personnelle que j'avais déjà développé pour créer des images png :
    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
     
    public class PngImage {
      public static final String FORMAT_NAME = "png";
      private final BufferedImage bufferedImage;
     
      public PngImage(final int width, final int height) {
        this.bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
      }
     
      public PngImage(final BufferedImage image) {
        this.bufferedImage = image;
      }
     
      public Graphics2D getGraphics2D() {
        return this.bufferedImage.createGraphics();
      }
     
      public void write(final String fileName) throws IOException {
        String outFile = fileName;
        if (!fileName.endsWith(PngImage.FORMAT_NAME)) {
          outFile = outFile + "." + PngImage.FORMAT_NAME;
        }
        ImageIO.write(bufferedImage, FORMAT_NAME, new File(outFile));
      }
    }
    Voila, j'espère que mon post sera utile à quelqu'un d'autre.

    A+
    Gronono

    Edit : Prise en compte des remarques de bouye.

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 854
    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 854
    Points : 22 876
    Points
    22 876
    Billets dans le blog
    51
    Par défaut
    Juste une petite remarque : ce n'est pas forcement une bonne idee que de garder une reference sur le Graphics de l'image dans la mesure ou on peut faire dispose() dessus n'importe quand (et on doit le faire quand on a finit de dessiner d'ailleurs pour eviter des fuites memoires). Ainsi getGraphics2D() devrait plutot etre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     public Graphics2D getGraphics2D() {
        return bufferedImage.createGraphics();
      }
    Enfin, meme si tout est correct un simple ImageIO.write(bufferedImage, "png", outFile) n'aurait-il pas ete plus simple ? Sachant que le support du PNG est dans ImageIO depuis la premiere version.

  9. #9
    Membre confirmé Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2003
    Messages : 456
    Points : 482
    Points
    482
    Par défaut
    Merci Bouye pour tes remarques.

    J'ai édité le post précédent pour prendre en compte tes remarques.

    Effectivement ImageIO.write est plus simple.

    A vrai dire je me perds un peu dans la manipulation des images en Java.
    Mais c'est surement parce que je ne pratiques pas beaucoup.

    A+
    Gronono

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

Discussions similaires

  1. Algorithme lecture d'image au format SVG
    Par soft0613 dans le forum 2D
    Réponses: 2
    Dernier message: 15/02/2008, 17h39
  2. classe de lecture d'images
    Par suckthewindow dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 16/09/2005, 16h06
  3. Probleme de lecture d'image
    Par NicolasR dans le forum Java ME
    Réponses: 13
    Dernier message: 28/07/2005, 14h47
  4. [débutant] problème de lecture d'image
    Par shura dans le forum OpenGL
    Réponses: 16
    Dernier message: 03/07/2004, 18h05
  5. Sauvegarde d'une image sous un autre format
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 24/02/2004, 09h50

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