2010-04-15 4 views
2

J'ai noté que lorsque je dessine quelque chose avec Color (0,0,0,0), qui est sur une autre image, la couleur affichée est l'arrière-plan JFrame, pas l'image juste en dessous.Transparence dans les objets bufferedimage

Raisons qui m'aideraient à trouver une solution?

Merci! Editer: Voir les cercles, la zone grise (coins) devrait être transparente mais ne sont pas, à la place, ils sont la couleur du JFrame. alt text http://img72.imageshack.us/img72/9657/transparency.png

Et voici le code pour dessiner les cercles:

 
public void paint(final Graphics g) { 
     super.paintComponent(g); 
     final Graphics2D g2 = (Graphics2D) g; 

     RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     if (unitImage == null) { 

      unitImage = (BufferedImage) (createImage(30, 30)); 
      final Graphics2D gc = unitImage.createGraphics(); 
      gc.setRenderingHints(rh); 
      gc.setColor(outsideColor); 
      gc.fillOval(0, 0, diameter, diameter); 
      gc.setColor(middleColor); 
      gc.fillOval(diameter/6, diameter/6, (diameter/3) * 2, (diameter/3) * 2); 
      gc.setColor(innerColor); 
      gc.fillOval(diameter/3, diameter/3, diameter/3, diameter/3); 
     } 

     g2.drawImage(unitImage, null, 0, 0); 

avec le caressait Alphacomposites, je pense que ce ne est pas la solution. J'ai donc ajouté toutes ces nouvelles informations qui, je crois, vous aideront à me donner un autre conseil.

Répondre

6

@Chuk Lee a raison: Sauf modification, la valeur par défaut Graphics2D composite est AlphaComposite.SrcOver. Ce pratique tool affiche le résultat composite pour une règle sélectionnée et une paire spécifiée de couleur et alpha.

Addendum: Une approche consiste à remplacer paintComponent() et de rendre des cartes et des cercles, mais vous pourriez être en mesure de rendre les coins transparents en effaçant l'alpha:

... 
gc.setRenderingHints(rh); 
gc.setComposite(AlphaComposite.Clear); 
gc.fillRect(0, 0, diameter, diameter); 
gc.setComposite(AlphaComposite.Src); 
gc.setColor(outsideColor); 
... 

Est-ce que createImage(30, 30) concernent diameter? Pour quel composant substituez-vous paint() et invoquez super.paintComponent(g)?

+0

Joli outil. 3 caractères –

7

Avez-vous défini l'AlphaComposite avant de dessiner?

Graphics2D g2d = (Graphics2D)g; //Some graphics object 
//Save the original 
Composite original = g2d.getComposite(); 
//Set to semi translucent 
Composite translucent = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); 
g2d.setComposite(translucent); 

//Draw 

//Set back to original 
g2d.setComposite(original); 

Avertissement: Note de code testé

2

Vous peignez avec une opacité de 0. Si vous voulez du noir, utilisez Couleur (0,0,0,255).

MISE À JOUR

Désolé, j'ai mal compris votre question. Après avoir lu le code que vous avez ajouté à votre message, je suppose que les petites cibles sont des composants placés au-dessus de la carte qui est dessinée sur un composant parent.

Afin d'assurer que la transparence est utilisée, vous avez besoin de deux choses:

  1. vous devez appeler setOpaque (false) dans le constructeur du composant cible
  2. Soit dessiner directement la cible sans le soutien magasin, ou utiliser une image RGBA:

    unitéImage = new BufferedImage (30, 30, BufferedImage.TYPE_INT_ARGB);

+0

Le problème est le rectangle rempli dans l'image tamponnée devrait être la couleur de la couche ci-dessous, également une image tamponnée. J'ai mis 0 comme transparence. –

+0

Désolé, a mis à jour le poste –

+0

Dans la zone de champ de la classe j'ai déclaré: BufferedImage unitImage = new BufferedImage (30, 30, BufferedImage.TYPE_INT_ARGB); Dans la méthode de peinture de la même classe: unitImage = (BufferedImage) (createImage (30, 30)); \t \t \t final Graphics2D gc = unitéImage.createGraphics(); --- code de dessin ici --- Et maintenant les cibles ne sont pas dessinées du tout. Ou ils sont transparents aussi bien! –