# transparente farbe in Image mit Graphics



## ollilebowski (8. Sep 2005)

hallo! 

weiss einer, ob ich in einem Image, dass eine Graphics hat, 
also nicht mit createImage erstellt wurde. 
punkte transparent machen kann??? 

mit einem Image, dass mit createImage erstellt wurde kann ich das, 
aber bei anderen krieg ich das nicht hin! 

mfg, olli


----------



## Soulfly (8. Sep 2005)

1. Musst dir erst daraus ein BufferedImage erstellen.
2. Dann liest du das Raster vom BufferedImage heraus packst es in ein ByteArray (byte[]) 
3. Prüfe, ob es ein RGB oder RGBA Raster ist, (wenn RGB so umformen einweiteres Byte für A vorhanden ist)
4. Dann kannste dass Raster verändern wie du willst.
5. Lädst es dann wieder in das BufferedImage und lässt es zeichen.

Das wars soweit im Groben


----------



## ollilebowski (9. Sep 2005)

rgba is das mit alphawert oder? 
ist alpha der transparentwert, 
oder wie meinst du das?


----------



## lin (9. Sep 2005)

Ja, RGBA steht für Red Green Blue Alpha
Alpha ist der Transparenzwert, 255 heisst die Farbe ist ganz zu sehen, 0 heisst die Farbe ist nicht zu sehen...
Wenn du Punkte transparent machen willst, veränderst du einfach deren Alpha Wert.


----------



## lin (9. Sep 2005)

hm, bisserl code gefälligst? (zeichnet ellipse, kreis und hintergrund, und variert dann die alpha werte (nicht sonderlich schöner code, aber was solls ;-) )


```
import java.awt.*;
import java.awt.geom.*;

import javax.swing.*;

public class Alpha {
	JFrame f = new JFrame(); //JFrame, in welchem die Zeichnung ist
	static int W=300, H=300;
	
	public Alpha() {
		f.setSize(W, H);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setTitle("Alpha Value");
		
		JPanel pane = new JPanel(new BorderLayout());
		VarAlpha var = new VarAlpha();
		pane.add("Center", var.makeLabel());
		
		//Thread, der die Alpha Werte variert
		Thread thr = new Thread(var);
		thr.start();
		
		f.setContentPane(pane);
		f.setVisible(true);
	}
	
	public static void main(String[] args) {
		new Alpha();
	}
}

class Draw extends JLabel {
	int W, H, tw = 0, t=0;
	Color col1 = Color.ORANGE, col2 = Color.BLUE, col3 = Color.RED;
	
	public Draw () {
		this.W = Alpha.W;
		this.H = Alpha.H;
	}
	
	//hier werden die Bestandteile gezeichnet
	public void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D)g;
		
		g2.setColor(col1);
		Rectangle2D.Double rect = new Rectangle2D.Double( 0, 0, W, H );
		g2.fill(rect);
		g2.draw(rect);
		
		g2.setColor(col2);
		Ellipse2D.Double circle = new Ellipse2D.Double( 0, 0, W, H );
		g2.fill(circle);
		
		g2.setColor(col3);
		Ellipse2D.Double ell = new Ellipse2D.Double( W/4, 0, W/2, H );
		g2.fill(ell);
	}
	
	//hier werden die Farbe mit den entsprechenden Alpha-Werten erstellt, dann wird geupdatet
	public void setAlphas(int alpha1, int alpha2, int alpha3) {
		col1 = new Color( col1.getRed(), col1.getGreen(), col1.getBlue(), alpha2 );
		col2 = new Color( col2.getRed(), col2.getGreen(), col2.getBlue(), alpha2 );
		col3 = new Color( col3.getRed(), col3.getGreen(), col3.getBlue(), alpha3 );
		update();
	}
	
	public void update() {
		this.repaint();
	}
}

class VarAlpha implements Runnable {
	int alpha = 0;
	Draw draw = new Draw();
	
	public JLabel makeLabel() {
		return draw;
	}
	
	//hier wird das alpha variert, dann der Draw übergeben, und kurz schlafen gelegt
	public void run() {
		while(true) {
			while( alpha <=255 ) {
				draw.setAlphas(alpha, 255-alpha, alpha);
				try {
					Thread.sleep(2);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}			
				alpha ++;
			}
			alpha--;
			
			while( alpha > 0) {
				draw.setAlphas(alpha, 255-alpha, alpha); 
				try {
					Thread.sleep(2);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}	
				alpha--;
			}
		}
	}
}
```


----------



## ollilebowski (10. Sep 2005)

schon mal vielen dank für deine mühe! 
aber ich glaube, du hast mich falsch verstanden.

mit dem alpha wert kann man 
eine farbe durchsichtig auf ein image zeichnen, 
so dass die alte farbe noch durchschimmert. 
aber wenn man image1 dann auf image2 malt, 
werden die farben von image1 komlett über die von image2 gemalt. 

was ich will ist, 
dass - wenn man image1 auf image2 einmalt - 
die transparenten farben in image1 nicht über image2 gemalt werden. 
also transparente farben, wie bei einem gif. 
ein gif hat ja transparente pixel, 
und wenn man das gif malt, 
werden diese pixel einfach ausgelassen, 
und nichts wird übermalt. 

wie gesagt, trotzdem danke natürlich, 
olli


----------



## ollilebowski (10. Sep 2005)

am besten mach ich einen neuen thread auf, 
in dem die frage genauer gestellt wird. 
in "allgemeines" 
"Image mit durchsichtigen farben wie bei GIF?"


----------



## gast0815 (11. Sep 2005)

Nein! 
Der hat schon recht! 
Aber du mußt auf ein BufferedImage zeichnen und beim Erstellen 
	
	
	
	





```
BufferedImage img=new BufferedImage(deineHöhe,deineBreite,img.TYPE_INT_ARGB)
```
 eingeben. 
Dann wird das Pixel das du transparent zeichnest auch transparent wenn du das BufferedImage zeichnest!


----------



## ollilebowski (12. Sep 2005)

ja, klappt. 
danke!


----------

