Farbeimer

Status
Nicht offen für weitere Antworten.

anfänger15

Bekanntes Mitglied
Hallo

ich will meinem Malprogramm noch ein "Farbeimer", so wie bei paint hinzufügen.

Ich dachte da an folgendes, allerdings funktioniert das nicht 100%ig
Code:
 public void füllen(MouseEvent e){
 	Color farbEimerPixel = new Color(img.getRGB(e.getX(),e.getY()));
 	Color farbEimerPixel1 =new Color(img.getRGB(e.getX(),e.getY()));
 	System.out.println(farbEimerPixel);
 	Color aktuelleFarbe;
 	Color aktuelleFarbe1;	
 	
 for (int y = e.getY()-1; y <=this.getHeight() && y>0;y--){
 	aktuelleFarbe =new Color(img.getRGB(e.getX(),y));

 	if(farbEimerPixel.equals(aktuelleFarbe)){

 		img.setRGB(e.getX(),y,1);

 	 	for (int x = e.getX()-1; x <= this.getWidth() && x>0;x--){
 	 aktuelleFarbe =new Color(img.getRGB(x,y));
 	
 	if(farbEimerPixel.equals(aktuelleFarbe)){
 		img.setRGB(x,y,1);
 	
	}else{
	x = -1;
}
}
	for (int x1 = e.getX()+1; x1 <= this.getWidth() && x1<this.getWidth();x1++){
		 aktuelleFarbe =new Color(img.getRGB(x1,y));

 	if(farbEimerPixel.equals(aktuelleFarbe)){
 		img.setRGB(x1,y,1);

}else{
	x1 = this.getWidth()+1;

 }
}
}else{
	y = -1;

 }
}
 	
 	
 	
 		for (int y1 = e.getY(); y1 <= this.getHeight() && y1<this.getHeight();y1++){
 	 aktuelleFarbe =new Color(img.getRGB(e.getX(),y1));
 
   		if(farbEimerPixel.equals(aktuelleFarbe)){
 		img.setRGB(e.getX(),y1,1);

	for (int x1 = e.getX()+1; x1 <= this.getWidth() && x1<this.getWidth();x1++){
		 aktuelleFarbe =new Color(img.getRGB(x1,y1));

 	if(farbEimerPixel.equals(aktuelleFarbe)){
 		img.setRGB(x1,y1,1);

}else{
	x1 = this.getWidth()+1;

 }
}
	for (int x = e.getX()-1; x <= this.getWidth() && x>0;x--){
 	 aktuelleFarbe =new Color(img.getRGB(x,y1));
 	
 	if(farbEimerPixel.equals(aktuelleFarbe)){
 		img.setRGB(x,y1,1);
 	
	}else{
	x = -1;
}
}
}else{
	y1 = this.getWidth()+1;

 }
}
 
 
 
 
 
 
 	for (int x = e.getX()-1; x <= this.getWidth() && x>0;x--){
 	 aktuelleFarbe =new Color(img.getRGB(x,e.getY()));
 	
 	if(farbEimerPixel.equals(aktuelleFarbe)){
 		img.setRGB(x,e.getY(),1);
 	
 		for (int y1 = e.getY()+1; y1 <= this.getHeight() && y1<this.getHeight();y1++){
 	 aktuelleFarbe =new Color(img.getRGB(x,y1));
 
   		if(farbEimerPixel.equals(aktuelleFarbe)){
 		img.setRGB(x,y1,1);
 		}else{
	y1 = this.getWidth()+1;

 }
}
 	for (int y = e.getY()-1; y <=this.getHeight() && y>0;y--){
 	aktuelleFarbe =new Color(img.getRGB(x,y));

 	if(farbEimerPixel.equals(aktuelleFarbe)){

 		img.setRGB(x,y,1);
 		
 	}else{
	y = -1;

 }	
 		
}
	}else{
	x = -1;
}
}
 
 
	
 	for (int x1 = e.getX(); x1 <= this.getWidth() && x1<this.getWidth();x1++){
		 aktuelleFarbe =new Color(img.getRGB(x1,e.getY()));

 	if(farbEimerPixel.equals(aktuelleFarbe)){
 		img.setRGB(x1,e.getY(),1);

	for (int y1 = e.getY()+1; y1 <= this.getHeight() && y1<this.getHeight();y1++){
 	 aktuelleFarbe =new Color(img.getRGB(x1,y1));
 
   		if(farbEimerPixel.equals(aktuelleFarbe)){
 		img.setRGB(x1,y1,1);
 		}else{
	y1 = this.getWidth()+1;

 }
}
 	for (int y = e.getY()-1; y <=this.getHeight() && y>0;y--){
 	aktuelleFarbe =new Color(img.getRGB(x1,y));

 	if(farbEimerPixel.equals(aktuelleFarbe)){

 		img.setRGB(x1,y,1);
 		
 	}else{
	y = -1;

 }	
 		
}

}else{
	x1 = this.getWidth()+1;

 }
}
 	
 }

Bei meiner methode wird z.B. bei Kreisen nicht alles ausgefüllt außer die startkoordinaten sind die Kreismitte.

hat jemand eine bessere idee für ein farbeimer??

danke
 
S

SlaterB

Gast
was ist denn ein Farbeimer?
hätte jetzt gedacht, du meinst das Ausfüllen einer Fläche mit einer Farbe,

aber wieso dann ständig new Color,
und auch deine anderen 150 Zeilen könntest du doch mal grob erklären..
 

André Uhres

Top Contributor
anfänger15 hat gesagt.:
..hat jemand eine bessere idee für ein farbeimer?..
Z.B. den Floodfill Algorithmus:
http://www.codecodex.com/wiki/index.php?title=Implementing_the_flood_fill_algorithm
Code:
package paint;
/*
* FuellenDemo.java
*/
import java.awt.*;
import java.awt.Color;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
public class FuellenDemo extends JFrame {
    private Zeichenflaeche dr;
    public FuellenDemo() {
        super("Linksklick = blau füllen, Rechtsklick = weiss füllen.");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        dr = new Zeichenflaeche();
        add(dr);
        new Thread(new Runnable() {
            public void run() {
                try {Thread.sleep(300);} catch (InterruptedException ex) {}
                dr.kreisZeichnen();
            }
        }).start();
    }
    public static void main(final String args[]) {new FuellenDemo().setVisible(true);}
}
class Zeichenflaeche extends JPanel{
    private BufferedImage img;
    private Graphics2D g2d;
    public Zeichenflaeche(){
        addMouseListener(new MouseAdapter(){
            public void mouseReleased(final MouseEvent e){
                int x = e.getX();
                int y = e.getY();
                int[] fill = {0,0,255,255};//fill with "blue" color
                if(e.isPopupTrigger()){
                    fill = new int[]{255,255,255,255};//fill with "white" color
                }
                fuellen(img, x, y, fill) ;
                repaint();
            }
        });
    }
    public void kreisZeichnen(){
        g2d.setColor(Color.BLACK);
        g2d.drawOval(40, 40, 100, 100);
        g2d.drawOval(80, 80, 100, 100);
        int[] fill = {0,0,255,255};//fill with "blue" color
        fuellen(img, 10, 10, fill) ;
        fuellen(img, 100, 100, fill) ;
        repaint();
    }
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        if (img == null) {
            img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
            g2d = (Graphics2D)img.getGraphics();
            g2d.setColor(Color.white);
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.setColor(Color.black);
        }
        g.drawImage(img, 0, 0, null);
    }
    /*
     * flood fill algorithm adapted by Claudio Santana for Java:
     */
    // Initial method you must call:
    void fuellen(final BufferedImage image, final int x, final int y, final int[] fill) {
        WritableRaster raster = image.getRaster();
        int[] aux = new int[] {255,255,255,255};
        if ( checkPixel(raster.getPixel(x,y,aux),fill)!=0 )
            return;
        fuellen(raster,x,y, fill,raster.getPixel(x,y,aux) );
    }
    private void fuellen(final WritableRaster raster, final int x, final int y,
            final int[] fill, final int[] old) {
        int fillL, fillR,i;
        int in_line=1;
        int[] aux =   {255,255,255,255};
        Rectangle d = raster.getBounds();
        // find left side, filling along the way
        fillL = fillR = x;
        while(in_line!=0) {
            int[] p = raster.getPixel(fillL,y,aux);
            raster.setPixel(fillL,y,fill);
            fillL--;
            in_line = (fillL < 0) ? 0 : checkPixel(raster.getPixel(fillL,y,aux),old);
        }
        fillL++;
        // find right side, filling along the way
        in_line = 1;
        while (in_line!=0) {
            raster.setPixel(fillR,y,fill);
            fillR++;
            in_line = (fillR > d.width-1) ? 0 : checkPixel(raster.getPixel(fillR,y,aux),old);
        }
        fillR--;
        // look up and down
        for( i=fillL; i<=fillR; i++ ) {
            if ( y>0 && checkPixel(raster.getPixel(i,y-1,aux),old)!=0 )
                fuellen(raster,i,y-1,fill,old);
            if ( y<d.height-1 && checkPixel(raster.getPixel(i,y+1,aux),old)!=0 )
                fuellen(raster,i,y+1,fill,old);
        }
    }
    private int checkPixel(final int[] oldPix, final int[] newPix) {
        return (newPix[0] == oldPix[0] &&
                newPix[1] == oldPix[1]   &&
                newPix[2] == oldPix[2]  &&
                newPix[3] == oldPix[3] ? 1:0);
    }
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben