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 :

Utiliser Deux BufferImage (appliquer l'un sur l'autre)


Sujet :

2D Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 79
    Par défaut Utiliser Deux BufferImage (appliquer l'un sur l'autre)
    Bonjour,
    J'ai deux BufferImage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BufferedImage image_static=new BufferedImage(2048,2048,BufferedImage.TYPE_INT_ARGB);
    BufferedImage image_dynamic=new BufferedImage(2048,2048,BufferedImage.TYPE_INT_ARGB);
     
    g.drawImage(image_dynamic, 0, 0, this);
    g.drawImage(image_static, 0, 0, this);
    Le problème est que seul le dernier buffer donné à g.drawImage apparait. Alors que je voudrais la composition des deux. Mais je ne vois pas du tout comment faire. Une piste svp ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 44
    Par défaut
    Je pense qu'il faut jouer sur la couche "Alpha" qui gère la transparence.

    bufferedImage.setRGB(i, j, 0xff000000)

    -> positionne un point noir en (i, j) qui sera copié en destination

    bufferedImage.setRGB(i, j, 0x00000000)

    -> positionne un point noir en (i, j) qui ne sera pas copié en destination (pixel transparent)

    J'espère avoir bien compris moi meme comment cela marche

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    En passant par la transparence...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Graphics2D g2d = (Graphics2D) g;
    BufferedImage image_static=new BufferedImage(2048,2048,BufferedImage.TYPE_INT_ARGB);
    BufferedImage image_dynamic=new BufferedImage(2048,2048,BufferedImage.TYPE_INT_ARGB);
     
    g2d.drawImage(image_dynamic, 0, 0, this);
    //utilisation de transparence...
    g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.5f));
     
     
    g2d.drawImage(image_static, 0, 0, this);
    Sinon il te faut t'assurer que le fond de la deuxième BufferedImage est bien transparent (donc utiliser des png à la place de jpeg)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 79
    Par défaut
    Après des recherches sur internet je suis arrivé au truc du composite.

    Le problème c'est mon buffer buffer_dynamic j'ai besoin de l'effacer à chaque que je le mes a jour. Donc je le remplissais d'un fond blanc. Ca m'évitait de faire un new BufferedImage qui prend du temps (vu la taille du buffer!).

    En le remplissant de blanc, mon buffer_dynamic perd son fond transparent !!!
    Quand je le colle sur le buffer_static, buffer_static est pale (et ce à cause du fond blanc).

    J'ai besoin d'effacer le buffer_dynamic mais sans le recréer, sans faire de new !
    Une idée ?

    Ya moyen peut etre de definir la couleur de transparence du buffer ?

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Il faut effacer ton buffer avec du noir transparent, et non pas du blanc opaque.
    En d'autre termes, tu positionnes la règle AlphaComposite.SRC et la couleur new Color(0,0,0,0), avant de faire ton fillRect.

  6. #6
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Avant même çà, il y a un truc que j'ai zappé au niveau de ton code. Ton buffer dynamique doit affiché par dessus ou par dessous le buffer statique?

    Sinon pour effecer ton buffer sil suffit de dessiner dedans (méthode createGraphics de ton image puis un drawRectangle avec une couleur tranparente à mort)

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Citation Envoyé par sinok Voir le message
    Sinon pour effecer ton buffer sil suffit de dessiner dedans (méthode createGraphics de ton image puis un drawRectangle avec une couleur tranparente à mort)
    Il faut positionner la règle SRC. Par défaut, le graphics sera créé avec la règle SRC_OVER. Et dessiner du transparent avec la règle SRC_OVER, ca ne fait rien.
    Attention également (je suppose que c'est une typo), c'est fillRect qu'il faut appeler et non pas drawRect.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 79
    Par défaut
    Bon j'ai réussi ce que je voulais meme si j'ai pas tout saisi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	private void clearBufferARGB(Graphics2D g)
    	{
    		g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC,1f));
    		g.setColor(new Color(0,0,0,0)); // N'importe quelle couleur
    		g.fillRect(0, 0,2048, 2048); // Je rempli le buffer avec la couleur transparente
    	}
    En fait c'est l'histoire du composite que j'ai pas saisi et pourquoi sans ca ne marche pas.

  9. #9
    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
    La regle par defaut SRC_OVER fait que la resultante du dessin est un melange de la destination (ce qui est deja present dans l'image) et de la source (ce que tu es en train de dessiner) en prenant comme ordre que la source est pardessus la destination. Donc si tu dessines un rectangle complement transparent rien ne changera sur l'image puis que couleur existante + couleur transparente = couleur existante.

    La regle SRC fait que la resultante du dessin ne contiendra que les pixels de la source (ce que tu es en train de dessiner). L'image deviendra completement transparente puis que la source ne contient que des pixels transparents.

    Les regles sont expliquees dans la doc page de la classe AlphaComposite. Et tu peux egalement voir les exemples de Filthy Rich Clients le livre de Gfx (Chapitre 6) ou Java 2D Graphics le livre chez O'Reilly. tu as egalement un appercu "live" dans la demo Java2D fournie avec le JDK.
    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

Discussions similaires

  1. Matcher deux champs d'une table sur une autre
    Par lepotier dans le forum Développement
    Réponses: 2
    Dernier message: 14/12/2012, 10h33
  2. [PHP 5.0] Utiliser un fichier qui se trouve sur un autre domaine
    Par unix27 dans le forum Langage
    Réponses: 12
    Dernier message: 13/11/2011, 00h06
  3. deux structures pointant l'une sur l'autre
    Par mebibyte dans le forum Débuter
    Réponses: 3
    Dernier message: 23/03/2010, 09h43
  4. appliquer un panel sur un autre
    Par issam_ovic dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 05/09/2009, 14h24
  5. Réponses: 1
    Dernier message: 13/07/2009, 21h05

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