Trasparenza in bufferedimage oggetti
-
27-09-2019 - |
Domanda
Ho notato che quando disegno qualcosa con il Colore(0,0,0,0), che è in un'altra immagine, il colore visualizzato è il JFrame sfondo, non l'immagine sottostante.
I motivi che mi aiutano a trovare una soluzione?
Grazie!!
Edit:Vedere i cerchi, la zona grigia (angoli) deve essere trasparente, ma non sono, invece, essi sono il colore del JFrame.il testo alt http://img72.imageshack.us/img72/9657/transparency.png
E qui c'è il codice per disegnare i cerchi:
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);
State giocando con il Alphacomposites, penso che la sua non è la soluzione.Così ho aggiunto tutte queste nuove informazioni che, credo, vi aiuterà a ragazzi di darmi un'altra punta.
Soluzione
@Chuk Lee ha ragione: se non la si cambia, il default Graphics2D
composito è AlphaComposite.SrcOver
. Questo pratico strumento visualizza il risultato composito per una regola selezionata e una coppia di colore specificato e alfa.
Addendum: Un approccio è quello di ignorare paintComponent()
e rendere sia mappa e circoli, ma si potrebbe essere in grado di rendere gli angoli trasparenti deselezionando l'alfa:
...
gc.setRenderingHints(rh);
gc.setComposite(AlphaComposite.Clear);
gc.fillRect(0, 0, diameter, diameter);
gc.setComposite(AlphaComposite.Src);
gc.setColor(outsideColor);
...
non createImage(30, 30)
riguardano diameter
? Per quale componente si fa a ignorare paint()
e invocare super.paintComponent(g)
?
Altri suggerimenti
Hai impostato il AlphaComposite prima di iniziare a disegnare?
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);
Disclaimer:codice nota testata
si è dipinto con un'opacità 0. Se è nero che si desidera, utilizzare il colore (0,0,0,255).
UPDATE
Siamo spiacenti, ho capito male la domanda. Dopo aver letto il codice è stato aggiunto al tuo post, suppongo che i piccoli obiettivi sono componenti posizionati sulla parte superiore della mappa che è disegnato su un componente principale.
Per garantire che la trasparenza è usato avete bisogno di due cose:
- è necessario chiamare setOpaque (false) nel costruttore del componente di destinazione
-
O disegnare direttamente l'obiettivo senza archiviazione secondaria, o utilizzare un'immagine RGBA:
unitImage = new BufferedImage (30, 30, BufferedImage.TYPE_INT_ARGB);