Farbe eines Pixels ermitteln

snoopysalive

Mitglied
Hallo!

Wie ist es möglich, die Farbe an einem bestimmten Pixel (also Point-Objekt) einer JComponent zu ermitteln?

Beispiel: Ich hab mir eine GUI entwickelt, die mir mehrere per setBackground() eingefärbte Kästchen anzeigt. Wenn ich auf eines dieser Kästen klicke, soll es mir ausspucken, welche Farbe der angeklickte Pixel hat. Also sowas ähnliches wie bei einem ColorChooser.

Nun gut, ich könnte die Farbe natürlich per getBackground() ausspucken lassen, aber ich will später statt einfacher Kästchen richtige Bilder verwenden und da zieht getBackground() natürlich nicht mehr.

Danke und Gruß,
Matthias
 
Hallo,

versuchs mal mit
Robot robot = new Robot(); //Instantitierung ist teuer... also besser nur einmal machen ;-)
Color pixelColor = robot.getPixelColor(x, y);

Gruß Tom
 
Danke für den Tipp. Ist ja eigentlich ganz einfach.

Aber damit kann ich nicht die Farbe eines Pixels ermitteln, der sich unterhalb einer Komponente befindet, oder?! Also wenn sich beispielsweise zwei Kästchen überlappen. Das ist jetzt eher eine theoretische Frage, also bitte keine "Aber das braucht doch keiner"-Antworten. Mich würd's nur interessieren, ob und wenn ja, wie das möglich wäre.

Gruß,
Matthias
 
Jap, jetzt hab ich's hinbekommen. Wenn man BufferedImage verwendet, geht das alles sehr leicht, selbst wenn die entsprechende Ebene sich hinter einer anderen Ebene befindet. Für alle, die's interessiert, hier mal ein Kurzer Code-Schnipsel, der das Vorgehen illustriert.

Java:
public class PixelColor extends JPanel {
   public PixelColor() {
      fetchImage();
      addMouseListener(new MouseHandler());
   }
		
   /**
   * Bild als Hintergrundbild zeichnen
   */
   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D)g;
      g2.drawImage(image, 0, 0, null);
   }
		
   /**
   * Bild beziehen
   */
   private void fetchImage() {
      try {
         image = ImageIO.read(new File("Pfad/zu/Bilddatei"));
      } 
      catch (IOException e) {
         e.printStackTrace();
      }
   }
		
   /**
   * Auf Mausklick reagieren und Pixel auswerten
   */
   private class MouseHandler extends MouseAdapter {
      public void mouseClicked(MouseEvent e) {
         int colorValue = image.getRGB(e.getPoint().x, e.getPoint().y);
         Color color = new Color(colorValue);
         /*
         * Hier Abfragen stellen. Mein Beispiel prüft das Pixel
         * darauf, ob es schwarz ist.
         */
          if (color.equals(Color.BLACK))
            System.out.println("ist schwarz");
          else
            System.out.println("ist nicht schwarz");
       }
   }
		
   private BufferedImage image;
 }
 
Wieso lädst du denn ein Bild in fetchImage. Wäre doch einfacher ein neues zu erstellen mit der größe des Panels.
 
Ich will ja ein bestehendes Bild im Hintergrund haben. Deshalb lade ich das Bild in fetchImage(). Oder habe ich deine Frage falsch verstanden?
 
Hmm dann hatte ich das völlig falsch verstanden was du tun willst. Ich dachte du willst wissen welche Farbe ein bestimmtes Pixel auf einem Panel hat (ohne dass du ein bestimmtes Bild auf dieses Panel zeichnest).
 
Äh, jap, stimmt. Anfänglich wollte ich auch nicht die Pixelfarben eines Bildes ermitteln, sondern die einer JComponent. Tut mir leid wegen der Verwirrung. Ich habe einfach deinen Vorschlag vom 23. 03. umgedreht und speichere nicht die Bildinformation eines JPanels in eine Image-Datei, sondern werte ein vorhandenes Image aus.
 
Zurück