# Pixelfarbe von Panel ermitteln



## FKorni (15. Mai 2009)

Schreib gerade ein Programm in Java, nun würde ich aber gerne wissen wie ich die Farbe eines Pixels von einem Panel ermittle. Ich finde zwar im Internet eine menge Befehle aber keiner funktioniert, bzw. ich weiß nicht genau wie ich die verwenden muss.

Würde mich über eure Hilfe freuen.


----------



## Schandro (15. Mai 2009)

eine Möglichkeit:

du erstellst ein neues BufferedImage und gibts dessen Graphics-Object an die paintComponent Methode des JPanels. Danach kannst du mit
myBufferedImage.getData().getPixel(...)
die Pixels auslesen.

Ob das der beste Weg ist, weiß ich net


----------



## heart_disease (15. Mai 2009)

Ich hab's nicht ausprobiert, aber nach der Java API sollte das hier funktionieren:

```
JPanel.getColorModel().getRGB( int pixel )
```

getColorModel() ist aber eine dynamische, keine statische Funktion. JPanel musst du also hier klarerweise durch die Instanzvariable ersetzen. Die Methode getRGB() gibt dann den Farbwert des gewünschten Pixels als int zurück.


----------



## FKorni (15. Mai 2009)

Danke für eure Antworten.

Nur irgendwie hab ich immer noch keinen Plan^^

@Schandro kannst du mir bitte mal einen Beispielcode mit deiner Funktion geben?

@heart_disease hab deine Funktion gleich mal ausprobiert, ich bekomme jetzt Werte wie "-16777213", was mach ich jetzt damit? Brauch ja die Farbe bei einer bestimmten Stelle, aber ich kann ihm ja nicht mal die x und y Werte mit geben oder ich weiß nicht wie ich ihm die mitgebe? :noe:


----------



## Schandro (15. Mai 2009)

ohne zu testen:

```
BufferedImage img = new BufferedImage(panel.getSize().width,panel.getSize().height,BufferedImage.TYPE_INT_RGB);
Graphics g = img.createGraphics();
panel.paintComponent(g);
int[] thePixel = img.getData().getPixel(10,20,null);
```

€dit:
habs mal grad selber kurz ausprobiert und es hat immer 238 238 238 in thePixel ergeben...
k.A.


----------



## FKorni (15. Mai 2009)

Danke, aber es funktioniert nicht. 



> Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problems:
> The method paintComponent(Graphics) from the type JComponent is not visible
> The method getPixel(int, int, int[]) is ambiguous for the type Raster



Ok das erste Problem hab ich gelöst, es gehört paintComponent*s*, bleibt aber immer noch das Problem mit getPixel.


----------



## Schandro (15. Mai 2009)

mach vor das null ein cast auf 
int[]


----------



## FKorni (15. Mai 2009)

Zu viel Fachsprache, was ist ein cast?


----------



## Schandro (15. Mai 2009)

```
int[] thePixel = img.getData().getPixel(10,20,(int[])null);
```
ob die Lösung insgesamt überhaupt funktioniert musst du ausprobieren.


----------



## FKorni (15. Mai 2009)

Bekomme jetzt immer 3 0er, egal wo im Panel ich auslese.


----------



## Schandro (15. Mai 2009)

Beispielcode dafür das es doch geht:

```
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

public class XXX{

	public static void main(String[] args){
		new XXX();}


	private JFrame window = new JFrame();
	private JPanel panel = new JPanel();

	public XXX(){
		window.setBounds(100,100,200,200);

		window.add(panel);
		panel.setLayout(new GridLayout());

		JButton button = new JButton("Hallo");
		button.addActionListener(actionListener);
		panel.add(button);

		JButton button2 = new JButton("Welt!");
		button2.addActionListener(actionListener);
		panel.add(button2);


		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				window.setVisible(true);
			}
		});

	}

	ActionListener actionListener = new ActionListener(){
		public void actionPerformed(ActionEvent event){

			try{Thread.sleep(500);}catch(Exception e){e.printStackTrace();}

			final BufferedImage img = new BufferedImage(panel.getSize().width,panel.getSize().height,BufferedImage.TYPE_INT_RGB);
			panel.paintComponents(img.createGraphics());
			JFrame shower = new JFrame();
			JPanel showerPanel = new JPanel(){
				public void paintComponent(Graphics g){
					super.paintComponent(g);
					g.drawImage(img,0,0,null);
				}
			};
			showerPanel.addMouseListener(new MouseAdapter(){
				public void mouseReleased(MouseEvent event){
					System.out.println(Arrays.toString(img.getData().getPixel(event.getX(),event.getY(),(int[])null)));
				}

			});
			shower.add(showerPanel);
			shower.setSize(img.getWidth(null),img.getHeight(null)+23);
			shower.setVisible(true);
		}
	};


}
```


----------



## FKorni (15. Mai 2009)

Danke, so funktionierts, aber sobald ich das in mein Programm integriere dann geht nichts mehr.
Und ich hab auch keinen Plan wie ich das jetzt richtig in mein Programm integriere.


```
public void Überprüfung(int x, int y){
		Graphics g=jPanel.getGraphics();
				
		BufferedImage img = new BufferedImage(jPanel.getSize().width,jPanel.getSize().height,BufferedImage.TYPE_INT_RGB);
		jPanel.paintComponents(g);
		int[] thePixel = img.getData().getPixel(100, 100, (int[]) null);
		
		
		System.out.println(Arrays.toString(thePixel)); //Test
	}
```

So hab ich das jetzt, nur dann bekomme ich wie gesagt nur 3 0er. ;( (die Smileys sind einfach genial)


----------



## Schandro (15. Mai 2009)

mmh. Debugge mal ein bisschen. bau mal den Code ein damit du siehst wie das Bild aussieht von dem du das Pixel haben willst:

```
JFrame shower = new JFrame();
            JPanel showerPanel = new JPanel(){
                public void paintComponent(Graphics g){
                    super.paintComponent(g);
                    g.drawImage(img,0,0,null);
                }
            };
            showerPanel.addMouseListener(new MouseAdapter(){
                public void mouseReleased(MouseEvent event){
                    System.out.println(Arrays.toString(img.getData().getPixel(event.getX(),event.getY(),(int[])null)));
                }
 
            });
            shower.add(showerPanel);
            shower.setSize(img.getWidth(null),img.getHeight(null)+23);
            shower.setVisible(true);
```
(Das ist einfach ein Teilstück von meinem Code oben.)

Und schreib lieber createGraphics statt getGraphics.


----------



## Wildcard (15. Mai 2009)

Das ist falsch:

```
Graphics g=jPanel.getGraphics();
                
        BufferedImage img = new BufferedImage(jPanel.getSize().width,jPanel.getSize().height,BufferedImage.TYPE_INT_RGB);
        jPanel.paintComponents(g);
        int[] thePixel = img.getData().getPixel(100, 100, (int[]) null);
```
Du brauchst das Graphics Objekt des BufferedImage, nicht von jPanel


----------



## FKorni (16. Mai 2009)

Wenn ich deinen Code einbaue dann bekomme ich ein schwarzes Fenster/Bild, was dann wieder dem 0, 0, 0 entspricht...

Was ist den ganau der Unterschied zwischen createGraphics und getGraphics?


----------

