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:
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 ******************