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 :

Graphics2D: Stratégie de gestion de très grandes images


Sujet :

2D Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Par défaut Graphics2D: Stratégie de gestion de très grandes images
    Bonjour à tous !

    Je développe une application où un utilisateur peut dessiner des formes sur un canevas (un JPanel). Sur le fond du canevas sont dessinées plusieurs images "assemblées" ce qui peut former de (très) grandes images. L'utilisateur peut zoomer / dezoomer et se déplacer sur l'image.

    Jusqu'à présent je n'ai pas vraiment chercher à optimiser, tout est chargé en mémoire (BufferedImage) et quand l'OutOfMemoryError fut venue, le programme fut plantu. Mais désormais je souhaite faire quelque chose d'un peu mieux, je voudrais que l'utilisateur puisse utiliser des images très grandes et je ne sais pas vraiment quelle stratégie est la meilleure.

    Avant tout, malgré de nombreuses recherches je n'ai pas trouvé de librairie toute faite pour gérer ce genre de problème, mais en existe-t-il une ?

    Sinon existe-t-il une stratégie pour gérer ce genre de problème ? Un patron de conception ?

    Dois-je écrire l'image sur le disque, faire en sorte que l'utilisateur modifie cette image et répercuter les modifications sur l'affichage ?

    Merci pour votre attention

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il n'y a pas de secret : pour afficher une image dans un JPanel (ou un Canvas) il faut qu'elle soit entièrement chargée en mémoire. Combien de mémoire as-tu alloué à ton programme ? Une image 4096x4096 en RGB prend 64 MiB. Avec 1 GiB, tu peux déjà en charger pas mal. Si les images sont vraiment très grandes, de toute manière, à un moment donné, on ne peut pas afficher une image plus grande que l'écran. Enfin je veux dire que tout ce qui est affiché en dehors l'écran ne sert à rien, puisqu'on ne le voit pas. La solution pourrait être de découper l'image en tuiles, et de charger dynamiquement les tuiles pour n'avoir en mémoire que celles nécessaires pour remplir l'écran.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Par défaut
    Salut Joel, merci pour ta réponse.

    Citation Envoyé par joel.drigo Voir le message
    Combien de mémoire as-tu alloué à ton programme ?
    Je suis déjà au max, plus d'un 1Go, effectivement j'en affiche pas mal. Mais je souhaiterai en afficher une quantité bien plus importante, et je suis persuadé que je n'aurais pas besoin de tant de mémoire si j'arrive à gérer correctement l'affichage.

    La méthode des tuiles me parait très bien, mais comment est-ce que je devrais m'y prendre en détail ? Est-ce qu'il y a de la documentation en ligne ?

    J'envisageai aussi d'utiliser un ImageInputStream pour ne charger qu'une partie de l'image globale, mais j'avoue qu'un composant tout beau tout propre tout déjà fait m'aurait rendu service, et je suis assez étonné de ne rien trouver la-dessus

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    La classe prévue pour gérer les images "tuilées" est RenderedImage. Pour créer les tuiles, on peut utiliser BufferedImage.getSubImages().

    On doit pouvoir trouver des APIs qui gèrent ça. Cherche si on peut adapter une API d'affichage du type Google Maps. Il y a par exemple swagd.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du 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 901
    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 901
    Billets dans le blog
    54
    Par défaut
    Lors de la JavaOne de 2012, un des présentateurs de l'époque (Johan Vos ?) avait discuter de la manière dont ils avaient implémenté un visualiseur de map similaire a GoogleMap en JavaFX. Bien qu'ici il s'agisse de Swing et pas d'un logiciel a but SIG, le principe reste similaire compte tenu du nombre d'image : au final pour éviter des OutOfMemoryError, ils avaient utilisé des tuiles stockées dans une WeakHashMap. En principe, lorsque le soft arrive prés de sa limite de mémoire, le contenu de la WeakHashMap qui n'a plus de références hard est automatiquement libéré. Le logiciel doit alors recharger les images qui sont en défaut dans le cache (soit absentes car non-chargée soit déjà garbage collected) ; c'est un peu ce que font les libs de mapping js lorsque tu scrolles hos de la zone affichée.

    EDIT - si je regarde l’implémentation actuelle de la chose, ils utilisent une HashMap mais avec des SoftReference (et dans leur cas ils ont une Map par niveau de zoom).
    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
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Par défaut
    Citation Envoyé par bouye Voir le message
    au final pour éviter des OutOfMemoryError, ils avaient utilisé des tuiles stockées dans une WeakHashMap. En principe, lorsque le soft arrive prés de sa limite de mémoire, le contenu de la WeakHashMap qui n'a plus de références hard est automatiquement libéré. Le logiciel doit alors recharger les images qui sont en défaut dans le cache (soit absentes car non-chargée soit déjà garbage collected) ; c'est un peu ce que font les libs de mapping js lorsque tu scrolles hos de la zone affichée.
    Salut Bouye et merci beaucoup pour cette réponse !

    Effectivement je pense que c'est la meilleure solution qu'on m'ai proposé, et la moins contraignante. On m'a conseillé de compléter cette stratégie en essayant de charger les portions d'image affichées à l'écran à une résolution moindre pour réduire la taille en mémoire des BufferedImage. Je pense que je vais m'orienter vers cette solution. Merci pour ces précieux conseils !

Discussions similaires

  1. Quelle librairie pour faire des panoramas de très grandes images
    Par alexandre.granier dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 19/10/2012, 10h33
  2. Réponses: 2
    Dernier message: 13/02/2012, 14h02
  3. Affichage d'une très grande image
    Par Exca dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 26/12/2006, 20h26
  4. Très très grande image
    Par Exca dans le forum Tkinter
    Réponses: 5
    Dernier message: 23/11/2006, 10h38

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