Pixelfarbe erkennen - funktioniert nicht

papabaer1707

Aktives Mitglied
Hi, ich bin am Umsteigen auf Java (von Delphi) und bastel an einigen kleinen Problemen herum, um etwas zu lernen. Im Moment möchte ich ein Programm schreiben, mit dem ich mit der Maus Polygone zeichnen kann (funktioniert schon), diese auf Konvexität untersuche (geht auch) und dann auch füllen kann (hier hakt es). Zum Füllen gibt es verschiedene Algorithmen - ich wollte mit einem einfachen (rekursiven) beginnen ...

Mein Hauptproblem besteht wohl darin, die Pixelfarbe auf meiner Zeichenfläche (DrawPanel) auszulesen. Hab hier und da etwas gefunden ... zuletzt habe ich es so probiert:
Java:
  public void mouseMoved(MouseEvent e) {
  
    int ex = e.getX();
    int ey = e.getY();

    if (e.getSource() == zeichenBlatt)
    {
      int color = zeichenBlatt.getPixelColor(ex,ey).getRed();
      System.out.println("Color ist " + color);
    }
  }

zeichenBlatt ist ein JPanel (bei mir erweitert um ein setPixel). Dort gibt es dann die Methode getPixelColor:
Java:
public class MyDrawPanel extends JPanel {

  private Robot robot;

  public MyDrawPanel () {
    super();
    try {
	robot = new Robot();
	} catch (AWTException e) {
	e.printStackTrace();
	}
  }

  ...

  // Liest Farbe eines Pixels aus
  public Color getPixelColor(int x, int y)
  {
    if(robot != null){
	return robot.getPixelColor(x,y);
    }
	return null;
  }

Gut, ich denke mir, wenn dies funktioniert, geht auch das Füllen ... nur die Farbe wird nicht korrekt ausgelesen. Wenn ich mit der Maus z. B. über die original weiße Fläche fahre, erhalte ich sogar unterschiedliche Werte von 0 bis 255???

Kann mir da jemand helfen?

Im Anhang habe ich mal alles beigegeben. Ich weiß, dass da nicht alles toll und effizient ist ... seufz, aber bis hierher hat es funktioniert. Ach ja, geschrieben ist das ganze im JavaEditor.

Irgendwo in diesem Forum hatte ich auch mal ein tolles Tutorial gesehen, in dem beschrieben wurde, wie man "gut" zeichnet - habs hier nicht umsetzen können (auch aus Zeitgründen).
 

Anhänge

Robot benutzt als Nullpunkt des "Koordinatensystems" die obere linke Ecke des Bildschirms, der MouseListener benutzt die obere linke Ecke des Components.... Deswegen liest du die falschen Pixels aus. Du könntest natürlich die Position des Components relativ zum Bildschirm zu deinen Koordinaten hinzuaddieren, aber ich bin mir sicher da gibts auch ne einfachere Lösung. Habs sie aber grade vergessen 🙁
 
Zuletzt bearbeitet:
Hm, das konnte ich leicht ändern - das Problem bleibt. Was mich wundert ist, dass ich auf einer eigentlich komplett weißen Fläche unterschiedliche Rückgabewerte für die Pixelfarbe bekommen ...
 
Java:
public void mouseMoved(MouseEvent e) {
  
    int ex = e.getX()/zoomFaktor;
    int ey = e.getY()/zoomFaktor;

    if (e.getSource() == zeichenBlatt)
    {
      int color = zeichenBlatt.getPixelColor(ex,ey,zeichenBlatt.getX(),zeichenBlatt.getY()).getRed();
      System.out.println("Color ist " + color);
    }
  }
... und ...
Java:
  public Color getPixelColor(int x, int y, int cx, int cy)
  {
    if(robot != null){
      return robot.getPixelColor(x+cx,y+cy);
    }
    return null;
  }

... bzw. mit dieser Variante ...

Java:
return robot.getPixelColor(x+this.getX(),y+this.getY());

In der Konsole wird nach wie vor sowas ausgegeben:
Java:
Color ist 0
Color ist 240
Color ist 242
Color ist 239
Color ist 237
Color ist 236
Color ist 255
Color ist 255
Color ist 128
Color ist 255
Color ist 255
Color ist 0
Color ist 255
Color ist 240
Color ist 240
Color ist 240
Color ist 255
Color ist 240
 
Java:
int color = zeichenBlatt.getPixelColor(ex,ey,zeichenBlatt.getX(),zeichenBlatt.getY()).getRed();
getX und getY liefern nur die Location relativ zur Vatekomponente...
benutz getLocationOnScreen().getX/Y
 
Zuletzt bearbeitet:
Java:
int color = zeichenBlatt.getPixelColor(ex,ey,zeichenBlatt.getX(),zeichenBlatt.getY()).getRed();
getX und getY liefern nur die Location relativ zur Vatekomponente...
benutz getLocationOnScreen().getX/Y

getLocationOnScreen hört sich gut an, aber ich bekomme es nicht eingebaut. Wie gebe ich meine Koordinaten ein und wandle diese um?
 
So, hab's doch hinbekommen:
Java:
  // Liest Farbe eines Pixels aus
  public Color getPixelColor(int ex, int ey)
  {
    if(robot != null){
      int x = this.getLocationOnScreen().x + ex;
      int y = this.getLocationOnScreen().y + ey;
      return robot.getPixelColor(x,y);
    }
    return null;
  }

Das Polygon wird auch gefüllt - zwar langsam, aber es ist auch nicht die optimale Variante 🙂. Schneller müsste es auch gehen, wenn erst auf ein Image gezeichnet wird und dann das Bild kopiert wird ... nur hab ich da keine Ahnung - probiere ich später ...
 

Zurück
Oben