JavaFX PixelWriter.setColor setzt Farbe nicht

hk

Bekanntes Mitglied
Hallo Forum,
ich habe eine Klasse zum Umfärben von Pixeln bei der die Anweisung "pixelWriter.setColor()" nicht funktioniert (die alte Farbe bleibt erhalten). In der Folge er Code:

Java:
package com.hk.bereichumfaerben;

import java.util.Stack;
import javafx.geometry.Point2D;
import javafx.scene.image.Image;
import javafx.scene.image.PixelReader;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.paint.Color;

/**
 * Umfärben von Bereichen eines Images
 * - Eine Farbe wird durch eine Andere ersetzt
 * - Alle Farben werden bis zu einer "Stoppfarbe" ersetzt
 *
 * @author Heinz Köck
 */
public class RecolorImage {
  private Stack<Point2D> stack;
  private Image img;
  private Point2D actPoint;
  private Color oldColor, newColor;
  private double imgTopBorder;
  private double imgRightBorder;
  private double imgBottomBorder;
  private double imgLeftBorder;   
 
  /**
   * Ersetzt eine Farbe in einer zusammengehörigen Fläche
   * eines Images durch eine andere Farbe.
   * @param img       das Image
   * @param x         X-Position innerhalb der Fläche
   * @param y         Y-Position innerhalb der Fläche
   * @param oldCol    zu ersetzende Farbe
   * @param newCol    die ersetzende Farbe
   */
  public void replaceColor(Image img, int x, int y, Color oldCol,
          Color newCol) {
    
    // Class-Werte initialisieren
    stack = new Stack<>();
    this.img = img;
    actPoint = new Point2D(x, y);
    oldColor = oldCol;
    newColor = newCol;
    setBorder();        //setzt die äusseren Grenzen
    PixelReader pixelReader = img.getPixelReader();
    WritableImage wImage = new WritableImage((int)img.getWidth(),
                 (int)img.getHeight());   <<<<<<<<<<<<<<<<<<<<<
    PixelWriter pixelWriter = wImage.getPixelWriter(); <<<<<<<<<<<<<<<<<<<<
    actPoint = searchStartPoint(actPoint, pixelReader);  //Ermittelt echten Startpunkt
    stack.push(actPoint);
 
    // Ein gespeicherter Startpunkt wird in X-Richtung solange
    // umgefärbt bis eine Falschfarbe auftritt.
    while (!stack.isEmpty()) {
      actPoint = stack.pop();
      int px = (int) actPoint.getX();
      int py = (int) actPoint.getY();
      boolean isUp = false;
      boolean isDown = false;
      
      // Pixel umfärben und mögliche neue Startpunkte setzen
      while(px <= imgRightBorder) {
        Color color = pixelReader.getColor(px, py);
        if(!color.equals(oldColor))  break;     //Falschfarbe gefunden
        pixelWriter.setColor(px, py, newColor); <<<<<<<<<< Fehler
        
        // Wenn noch kein Startpunkt für die darüberliegende
        // Reihe gesetzt ist wird geprüft ob dieses Pixel
        // ebenfals umzufärben ist. Dann wird dieser Punkt
        // ein neuer Startpunkt.
        if(!isUp) {
          int upY = py -1;
          if(upY >= imgTopBorder) {
            color = pixelReader.getColor(px, upY);
            if(color.equals(oldColor)) {
              Point2D point = new Point2D(px, upY);
              stack.push(point);
              isUp = true;
            } //end if color ----------------
          } //end if upY --------------------
        } //end if isUp ---------------------
        
        // Wenn noch kein Startpunkt für die darunterliegende
        // Reihe gesetzt ist wird geprüft ob dieses Pixel
        // ebenfals umzufärben ist. Dann wird dieser Punkt
        // ein neuer Startpunkt.       
        if(!isDown) {
          int downY = py +1;
          if(downY <= imgBottomBorder) {
            color = pixelReader.getColor(px, downY);
            if(color.equals(oldColor)) {
              Point2D point = new Point2D(px, downY);
              stack.push(point);
              isDown = true;
            } //end if color ----------------
          } //end if downY ------------------         
        } //end if !isDown ------------------
        px++;         //nächste Pixelposition
      } //end while true --------------------
    } //end while stack.size ----------------
  } //end func replaceColor *****************
 
  /**
   * Startposition finden
   * Von der Pseudo-Startposition aus wird in X-Richtung
   * nach links der Beginn des Farbbereichs gesucht.
   * @param actPoint
   * @param pr
   */
  private Point2D searchStartPoint( Point2D actPoint, PixelReader pr) {
    int x = (int) actPoint.getX();
    int y = (int) actPoint.getY();
//    Point2D point;
    while (x >= imgLeftBorder) { 
      
      Color color = pr.getColor(x, y);
      if(!color.equals(oldColor))  break;
      x--;
    } //end while --------------------------
    return new Point2D(x +1, y);
//    return point;
  } //end searchStartPoint ******************
  /**
   * Setzt die äusseren Grenzen
   */
  private void setBorder() {
    imgTopBorder = 0;
    imgRightBorder = 15;
//    imgRightBorder = img.getWidth() -1;
    imgBottomBorder = 15;
//    imgBottomBorder = img.getHeight() -1;
    imgLeftBorder = 0;       
  } //end setBorder *************************
} //end class RecolorImage ******************
 

mrBrown

Super-Moderator
Mitarbeiter
Grad nur überflogen: wenn ich das richtig sehe erstellst Du ein neues Image wImage, setzt auf diesem die neue Farbe, und machst dann nichts damit.
 

hk

Bekanntes Mitglied
Grad nur überflogen: wenn ich das richtig sehe erstellst Du ein neues Image wImage, setzt auf diesem die neue Farbe, und machst dann nichts damit.
Danke, habe mir das nochmals angesehen und es wie folgt geändert. Nun funktioniert es.
Java:
    // PixelReader und -Writer erstellen
    PixelReader pixelReader = img.getPixelReader();
    WritableImage wImage = new WritableImage(pixelReader, 100, 100);
    PixelWriter pixelWriter = wImage.getPixelWriter();
    pixelReader = wImage.getPixelReader();    //muss nun auch auf wImage zeigen
 

Ähnliche Java Themen

Neue Themen


Oben