Bonjour à tous, je suis nouveau sur ces grands forums de developpez.com.
J'ai une fenêtre JFrame
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 public class Client extends JFrame { ...
Dans laquelle j'utilise le conteneur simple :
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 // # base du fenêtrage java.awt.Container c = getContentPane(); // # scène de base stage = new Stage(this, 800, 600); c.add(stage, "Center");
auquel j'ajoute un objet Stage qui est la base de ma plateforme graphique.
Cette dernière consiste simplement en un arbre contenant des nodes graphiques.
Puis ma fenêtre Client s'occupe, à chaque mise à jour graphique, de redessiner le tout (par récurrence, selon le pattern du visiteur).
Maintenant où le problème apparaît - sans que vous ne sachiez toujours de quoi il s'agit -, c'est que j'utilise un double buffer et donc j'ai un objet BufferStrategy :
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // # système visuel // double buffering createBufferStrategy(2); strategy = getBufferStrategy(); buffer = (Graphics2D)strategy.getDrawGraphics();
Jusque là, pas de gros problème...
Maintenant la mise à jour graphique :
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public void paint(Graphics g) { // Nettoyage if(buffer == null) return; buffer.clearRect(0, 0, getWidth(), getHeight()); // Nouvelle image stage.draw(new GraphicSession(buffer)); // Affichage en double-buffering hardware strategy.show(); }
Mon problème se trouve en fait ailleurs...
J'utilise ce système du visiteur via l'objet GraphicSession qui transmet le buffer Graphics2D à tous les enfants du stage.
Ainsi chacun affiche son image par-dessus (et toutes les branches sont ordrées pour que l'ordre d'affichage soit correct).
Mon problème, c'est que je voudrais pouvoir agir sur l'image complète.
Je compte appliquer un filtre RescaleOp pour modifier la luminosité de la scène complète.
Mais je n'ai pas accès à un objet BufferedImage... je n'ai accès qu'à l'objet Graphics2D.
Comment puis-je m'y prendre pour appliquer un filtre sur l'image complète se trouvant dans l'objet buffer, double-buffer hardware ?
Ma première idée est de réussir à faire une copie de ce qui se trouve dans le Graphics2D buffer, puis d'appliquer RescaleOp à cette copie puis de dessiner cette copie dans l'objet buffer.
Mais y a-t-il un moyen de faire une copie de l'objet Graphics2D ?
J'ai essayé de voir si on avait accès à l'image liée au buffer, mais ça se complique car il y a plusieurs types de BufferStrategy, et dans chaque cas il y a encore des tas de moyen de création des images de base... et je m'y perds surtout que je n'y ai pas accès vu que les propriétés de base des instances BufferStrategy sont ... protégées
---
Suite à ce problème, je me demande en plus si mon idée d'utilisation de RescaleOp est la bonne.
Je compte assombrir / éclaircir la scène complète. Est-ce la méthode la plus rapide ?
Est-ce qu'appliquer une image transparente foncée par-dessus serait plus rapide ?
La question devient importante dans le fait que je compte ajouter la possibilité d'avoir des zones isolées où l'assombrissement n'est pas le même, genre des endroits de lumière.
Si je compte réaliser un assombrissement de la scène, tout en prenant compte de la possibilité d'avoir des zones (rondes) dont l'assombrissement sera modifié car éclairci, ai-je plutôt intérêt de m'y prendre autrement ?
La méthode autre la plus simple que je vois est :
- création d'une image foncée ayant la taille de ma scène, mais en transparence progressive = masque
- je m'occuper de rendre transparentes les zones qui portent de la lumière ou même plutôt blanches
- j'appliquer cette image à la scène
=> assombrissement des parties sombres sur le masque
=> les parties qui ont été supprimées sur le masque ne sont pas assombries
=> éclaircissement des parties blanchies sur le masque
Est-ce une solution potentiellement utilisable en sachant que cette opération est faite très souvent ? Le fait de passer par des filtres (RescaleOp) est-il plus efficace ?
Partager