# Graphics2D: Transparent übereinander zeichnen



## stef1981 (10. Okt 2011)

Hallo,

ich möchte mittels Graphics2d zwei Rechtecke unterschiedlicher Farbe transparent zeichnen. Die beiden Rechtecke überschneiden sich teilweise. Die Fläche an der sich beide überlappen soll aber nur in der Farbe des OBERSTEN ( zuletzt gezeichneten ) Rechtecks transparent gezeichnet werden und nicht mit der darunter liegenden "vermischt" werden. Ist das möglich und wenn ja wie?

Danke und Viele Grüße,

Stef


----------



## hdi (10. Okt 2011)

1. Vor dem Zeichnen das Schnittrechteck ermitteln
2. Anhand dieser Information ein 6-Eck für das untere Rechteck ableiten (new Polygon(...)), bei dem eben die Ecke wo sie sich schneiden fehlt
3. Das obere Rechteckt und das 6-Eck zeichnen (g.fillPolygon(...))

Sieht natürlich strange aus, wenn der Hintergrund auf dem du zeichnest, nicht einfarbig oder selbst nicht transparent ist.


----------



## Marco13 (10. Okt 2011)

Sollte auch mit einem geeigneten AlphaComposite (Java Platform SE 6) gehen... vielleicht


----------



## stef1981 (11. Okt 2011)

Wenn es irgendwie mit einem AlphaComposite funktionieren würde, wäre das natürlich am besten, da ich auch beliebige Polygone übereinander zeichnen will.


----------



## Michael... (11. Okt 2011)

Ist das überlagernde Rechteck komplett Transparent oder soll nur der Bereich der Überlagerung transparent sein.
Ersteres ginge einfach mit einer Composite vom Typ 
	
	
	
	





```
AlphaComposite.SRC
```
. Für letzteres müsste man eventuell etwas tricksen.


----------



## stef1981 (12. Okt 2011)

Ich zeige ein Bild an und zeichne darauf transparente gefüllte geometrische Strukturen. An der Fläche, an der sich zwei Strukturen überlagern soll NUR die Farbe der "obersten" Struktur transparent angezeigt werden, so dass man das darunterliegende Bild erkennt. Die Farbe soll nicht mit der darunterliegenden transparenten Struktur "vermischt" werden.


----------



## Michael... (12. Okt 2011)

Ich habe mal ein bestehendes Bsp. modifiziert, um die Auswirkung von AlphaComposite.SRC zu demonstieren. Die "transparenten Strukturen" müssen dabei zunächst auf ein transparentes BufferedImage gezeichnet werden: 

```
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class AlphaCompositeSrcDemo extends JFrame {
	private Image demoImage;
	private Image transparentObjectImage;

	public AlphaCompositeSrcDemo() {
		demoImage = AlphaCompositeSrcDemo.createSimpleImage(100, 100);
		transparentObjectImage = createTransparentObjectImage(false);
		final JPanel panel = new JPanel() {
			public void paintComponent(Graphics g) {
				super.paintComponent(g);
				Graphics2D g2 = (Graphics2D)g.create();
				g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
				
				g2.drawImage(demoImage, 30, 30, null);
				g2.drawImage(transparentObjectImage, 50, 50, null);
				g2.dispose();
			}
		};

		final JCheckBox check = new JCheckBox("aktivier Top Objekt");

		this.getContentPane().add(panel, BorderLayout.CENTER);
		this.getContentPane().add(check, BorderLayout.SOUTH);
		check.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				transparentObjectImage = createTransparentObjectImage(check.isSelected());
				panel.repaint();
			}
		});
	}

	private BufferedImage createTransparentObjectImage(boolean round) {
		BufferedImage newImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);
		Graphics2D g = newImage.createGraphics();
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g.setColor(new Color(0, 255, 0, 220));
		g.fillRect(0, 0, 100, 100);
		if (round) {
			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));
			g.setColor(new Color(255, 0, 0, 20));
			g.fillRect(20, 20, 100, 100);
		}
		g.dispose();
		return newImage;
	}

	public static BufferedImage createSimpleImage(int w, int h) {
		BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
		Graphics2D g = image.createGraphics();
		g.setColor(Color.BLUE);
		g.fillRect(0, 0, w, h);
		g.setColor(Color.YELLOW);
		g.setStroke(new BasicStroke(10));
		g.drawLine(0, 0, w, h);
		g.drawLine(w, 0, 0, h);
		g.dispose();
		return image;
	}

	public static void main(String[] args) {
		JFrame frame = new AlphaCompositeSrcDemo();
		frame.setBounds(0, 0, 200, 250);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
```


----------



## stef1981 (12. Okt 2011)

Hi Michael...,

hat funktioniert. Vielen Dank!!!


----------

