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 :

[JPanel] capturer une image


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 23
    Points
    23
    Par défaut [JPanel] capturer une image
    Bonjour,

    J'aurais voulu savoir s'il était possible de récupérer une image que j'affiche dans un JPANEL sans utiliser la classe ROBOT qui elle, fait un screenschot de l'écran.

    Merci

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    oui, tu peux en utilisant la méthode creatImage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Image image = createImage(this.getSize().width, this.getSize().height);


    PS: d'ailleur c'est la méthode de base pour les applis utilisant le double-buffering software

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Mon problème c'est que mon panel n'est qu'une fênetre ouverte vers un objet image plus grand que ce que le panel ne peux m'afficher.

    Donc en faisait monPanel.getWidth,... je n'aurai pas l'image en entier mais seulement ce qui est affiché, y'a-t'il une solution?

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Le double-buffering est une technique d'affichage qui permet de fortement diminuer le clipping (scintillement de l'image lors des réaffichages fréquents). Le principe est, au lieu de dessiner directement dans un JPanel, on dessine en fait dans une zone mémoire (invisible a l'écran).

    Lorsque l'on a fini de dessiner dans cette zone mémoire, on l'affiche véritablement à l'écran, en superposant les 2 images (l'ancienne qui est affichée et la nouvelle que l'on vient de manipuler)

    ça a peut être l'air compliqué comme ça mais c'est hyper simple à implémenter dans un programme !!

    Bout de code
    http://java.developpez.com/faq/java/...oublebuffering

    Exemple avec des applets
    http://www.dgp.utoronto.ca/~mjmcguff/learn/java/07-backbuffer




    [Edité par Braim : Evitez les injures ;-)

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par cyber_jad
    n'est qu'une fênetre ouverte vers un objet image

    bin récupère cet objet image là !

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Je pense que je vais utiliser ta méthode du double buffering software.

    En effet, mon application est la suivante. Je dois simuler un microscope virtuel en affichant des images JPEG2000 très grandes. Ce qu'il y'a c'est que mon décodeur jpeg2000 me décode les partie d'image que je désire mais par morceau (TILE). Pour le moment, j'affiche morceau par morceau en faisant comme si mon panel était une grille et je place le "morceau au bon endroit". L'image se construie ainsi petit à petit. Pour le moment j'utilise un vecteur qui possède toutes les image et je l'affiche. Le problème c'est quele panel est constament entrain de parcourir le vecteur et de repeindre le tout donc c'est pas très efficace. Je devrai également appliquer des filtres de couleur sur cette image affichée donc la solution est d'utiliser une image que je rafraichis dans le panel petit à petit comme dans le double buffering.

    Si je me trompe dis le moi

    Merci

  7. #7
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par cyber_jad
    Le problème c'est quele panel est constament entrain de parcourir le vecteur et de repeindre le tout donc c'est pas très efficace.
    Le DB ne va pas t'aider à diminuer la charge processeur ni améliorer les performances. Il va uniquement supprimer le clipping (image qui scintille et qui saute)

    Mais pour une appli comme la tienne je pense que c'est presque nécessaire de l'utiliser !

    Tu peux peut-être essayer d'optimiser le code pour améliorer les perfs, genre ne réactualiser que ce qui s'affiche à l'écran, ...


  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Quand tu parles de ne réactualiser que se qui s'affiche, tu veux dire utiliser la méthode g.drawImage en précisant un rectangle de réactualisation c ca?

  9. #9
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    oui tout à fait, en fait il faut essayer de réduire les temps de calcul si tu vois que ton prog rame (économiser les ressources).

    est-ce que tu pense aussi à faire un Thread.sleep(xxx) dans ton thread d'affichage ? (afin de "calmer la bête" ?)

  10. #10
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Tu veux dire que dans ma méthode PaintComponent(Graphics g), je dois mettre un Thread.sleep ????

  11. #11
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par cyber_jad
    Tu veux dire que dans ma méthode PaintComponent(Graphics g), je dois mettre un Thread.sleep ????
    non plutôt dans les boucles de tes méthodes run()

  12. #12
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2004
    Messages : 102
    Points : 156
    Points
    156
    Par défaut
    Autre suggestion. Tu peux écrire une classe qui implémente l'interface java.awt.image.RenderedImage et mettre en place les fonctions de gestion des "tiles" ( getMinTileX(), getNumXTiles() etc. )
    Tu laisses donc le runtime gérer les "tiles" à ta place.
    Il faut que tu te plonges dans le fonctionnement des classes Raster, WritableRaster, DataBuffer, et ComponentColorModel. Inspire-toi de la classe BufferedImage mais surtout n'essaie pas de la dériver. ( un peu long à expliquer pourkoi ne pas le faire ).
    Ca n'a rien de compliqué ( je l'ai fait ) et cela marche très bien. En plus, tu peux gérer ta mémoire comme tu le veux ( utiliser un pool de buffers pour les images affichées.)
    Enfin, tu as directement accés aux composantes RVB d'un pixel, ce qui permet d'optimiser certains calculs ( histogramme par exemple).

    Voilà.
    A+
    Hery

  13. #13
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Un grand merci pour ton explication.
    Est ce que cela t'ennuyerais de m'envoyer ton implémentation de la classe RenderedImage.
    Et aussi m'expliquer ce que tu entend pas "utiliser un pool de buffers pour les images affichées"

    Merci

  14. #14
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2004
    Messages : 102
    Points : 156
    Points
    156
    Par défaut
    Désolé, je ne peux pas t'envoyer le code de la classe( propriété industrielle ) et cela donnerait bcp d'indications sur le logiciel que ma société développe. Mais, franchement, cela n'a rien de compliqué.

    Utiliser un pool de buffers : en fait, si tu écris toi même cette classe, tu connais l'espace mémoire que tu utilises pour ton image et quand tu as fini d'utiliser l'image, tu peux mettre "de côté" cet espace pour t'en reservir pour une autre image.
    Avantage : Cela évite de faire des allocations dynamiques ( typiquement tu n'en fais qu'une au lancement ) ;
    Inconvénient : Tu es obligé d'allouer un espace mémoire plus important que celui dont tu as réellement besoin.
    Par exemple, si tu veux travailler sur des images 250x250 et 300x300, il faudra que tu alloues un espace mémoire de 300x300 même dans le cas 250x250.
    Mais cela évite une outOfMemory et que le garbage collector se lance de manière intempestive.
    Voilà
    Bon courage.

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

Discussions similaires

  1. Capturer une image WebCam?
    Par gui38 dans le forum Flex
    Réponses: 2
    Dernier message: 22/08/2007, 16h28
  2. [JPanel] inserer une image quand on clique sur un bouton
    Par the_ugly dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 19/12/2006, 13h41
  3. Capturer une image depuis DirectShow
    Par beral dans le forum C++Builder
    Réponses: 1
    Dernier message: 07/08/2006, 12h20
  4. [JPanel]Mettre une image dans un JPanel
    Par ehmppowa dans le forum Composants
    Réponses: 11
    Dernier message: 30/11/2005, 20h17
  5. [JPanel] ajouter une image
    Par Michel38 dans le forum Agents de placement/Fenêtres
    Réponses: 14
    Dernier message: 27/06/2005, 16h28

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