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 :

Affichage lent d'une image


Sujet :

2D Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Affichage lent d'une image
    Bonjour à tous,

    j'affiche une image dans un JPanel de 500x500. Cette image peut être de taille assez importante (2000x2000 par exemple), et l'affichage est alors très lent notamment lorsque j'essaye de la déplacer ou de zoomer dessus.

    Existe-t-il un moyen d'accélérer l'affichage, peut-être en ne sélectionnant que la partie de l'image qui apparaitra effectivement dans le JPanel ?

    Pour l'instant je fais un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(source, x1, y1, x2, y2, this);
    avec x2-x1 qui peut être supérieur à la taille du JPanel. Idem pour y2-y1.
    source est un BufferedImage.

    Merci d'avance

  2. #2
    Membre confirmé Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Points : 505
    Points
    505
    Par défaut
    As-tu essayé d'optimiser l'image avec createCompatibleVolatileImage ?

  3. #3
    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 : 48
    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 878
    Points
    22 878
    Billets dans le blog
    51
    Par défaut
    • Si l'image est deja chargee en memoire, pas besoin de passer un ImageObserver en argument lorsque tu la dessines. Si tu en passes un, ca aura tendance a etre plus long (le dernier parametre de drawImage() peut etre null).
    • Utiliser des images compatibles permet d'avoir de l'accelerration.
    • Quels indices/algorithme de rendus utilises-tu pour les zooms (nottament les zooms arrieres, ceux ou l'image est integralement visible) ?
      • Vu la taille de cette image, lorsque le zoom montre une vue eloignee de l'image, il est probablement plus interressant de pre-generer les appercuts aux divers niveaux de zooms plutot que de se reposer uniquement sur les methodes scale() et drawImage() du Graphics pour faire une mise a l'echelle en live.
      • Si l'image est trop grosse, lorsque le zoom montre une vue rapprochee de l'image, tu peux en fait te contenter d'afficher uniquement une sous-partie de celle-ci (voir getSubImage() - a noter que cette methode ne duplique pas les donnees contenues dans l'image : la vue pointe sur le meme buffer que l'image complete).
    • Si l'image est vraiment tres grosse et que des OutOfMemoryError sont generees, il faut aller voir du cote du JAI et des ses PlanarImage qui permet de recuperer une image sous forme de tile (sous-parties) et donc de ne pas la charger entierement en memoire. Cela te permet egalement de creer des appercus basse qualite de ton image lorsqu'on fait un fort zoom arriere en sautant 1 pixel sur 2, sur 3, etc... si necessaire.

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup

    J'ai appliqué une bonne partie de tes conseils et ça marche vraiment mieux.

    En ce qui concerne les zooms, je me contente de sélectionner la partie de l'image qui sera affichée à l'écran avec un getSubImage() puis de l'afficher via un drawImage(), ce qui simule un zoom. Je ne sais pas vraiment ce que vaut cette solution.

Discussions similaires

  1. [ETAT] Affichage conditionnel d'une image
    Par Ithilien dans le forum IHM
    Réponses: 1
    Dernier message: 03/01/2007, 19h46
  2. [VB6] Affichage centré d'une image
    Par Sophie2097 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 12/05/2006, 14h28
  3. Erreur pour l'affichage aléatoire d'une image
    Par bellebiquette dans le forum Langage
    Réponses: 3
    Dernier message: 21/04/2006, 22h45
  4. [Conception] affichage aleatoire d'une image
    Par bellebiquette dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 24/02/2006, 22h58
  5. [Tableaux] Ajouter l'affichage dynamique d'une image
    Par leloup84 dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 09h14

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