# Bild, Pixel- / Bereichsfarbe auslesen



## pyr0t0n (26. Mrz 2008)

Aloa,

wenn ich ein BufferedImage lade kann ich da jeden Pixel auf einen Bestimmten Farbwert überprüfen oder gar einen Bereich?

Bzw wie geht das überhaupt ? ^^

Hoffe das mir da einer weiterhelfen kann.

Gruß
pyr0t0n


----------



## The_S (27. Mrz 2008)

getRGB heißt hier das Zauberwort.


----------



## pyr0t0n (27. Mrz 2008)

ah ok vielen dank... nur hab ich noch ein anderes problem

Also erstmal ich habe ein bild mit einem Schwarzen Kreis und lasse nun das Bild nach der Farbe Schwarz absuchen und immer wenn er auf den Kreis trifft, addet mein Programm ein Punkt zu einem Polygon doch leider sieht das beim zeichnen dieses Polygon dann so aus wie auf dem angehängtem Bild.

Gibts da ne andere möglichkeit wie ich ein "Abbild" von meinem Bild in eine Polygonform kriege?


----------



## Marco13 (27. Mrz 2008)

Hm. Beim Polygon wird davon ausgegangen, dass alle Punkte im Uhrzeigersinn (oder Gegenuhrzeigersinn) angegeben sind. Also, wenn du Spaltenweise durch's bild läufst, kommt da ein ziemliches Zickzack raus. _Theoretisch_ wäre eine Möglichkeit:
1. Man sucht den ersten schwarzen Pixel p und fürgt ihn in eine Liste ein
2. Solange Pixel p noch schwarze Nachbarn q hat, die nicht in der Liste liegen
{
    füge q in die liste ein
    setze p=q
}

Aber das ist so ziemlich das billigste, was man machen kann. Eine "robuste, qualitativ hochwertige Vektorisierung eines Bitmap-Bildes" wirst du damit nicht hinbekommen...


----------



## pyr0t0n (27. Mrz 2008)

gibts denn sonst noch ne möglichkeit wie ich da nen Abbild von erzeugen kann wenn man die Polygone mal aussen vor lässt.


----------



## Marco13 (27. Mrz 2008)

Ja... ein Programm verwenden, die sowas können, oder nachsehen, ob es eine Java-Bibliothek gibt, die sowas kann, oder... selbst schreiben. Je nach gewünschtem Reslutat könnte letzteres aber entsprechend aufwändig sein.


----------



## 0x7F800000 (27. Mrz 2008)

Wieso? Die von Marco13 vorgeschlagene möglichkeit erscheint mir recht plausibel, und ist auch nicht schwer umzusetzen, und vor allem sollte es akzeptable ergebnisse liefern. Statt polygonzug kannst du da auch ein wenig mit splines rumspielen, sieht vielleicht besser aus 

Aber ich hätte da mal eine frage: wo kriegst du das bild her? Mich wundert nämlich ein wenig, dass nicht der ganze kreis mit dem zickzack übermalt wird.
Wenn du es als .jpeg lädst oder ähnliches, dann must du im hinterkopf behalten, dass in .jpeg-komprimierten dateien an schwarzen kreisen so ziemlich gar nichts schwarz ist  , dann musst du nicht auf 0xFF000000 testen, sondern auch ähnliche farben akzeptieren.


----------



## pyr0t0n (27. Mrz 2008)

also ich nehme nen JPG dafür und mache das ganze dann so


```
try {
            bild = ImageIO.read(new File("C:\\bild.jpg"));
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        for(int a=0;a<bild.getWidth(); a++)
        {
            for(int b=0; b<bild.getHeight(); b++)
            {
                farbe = new Color(bild.getRGB(a, b));
                if(farbe.getGreen() == 0 && farbe.getBlue() == 0 && farbe.getRed() == 0)
                {
                    System.out.println("Schwarz gefunden");
                }
            }
        }
```

und es wird auf jedenfall die msg "Schwarz gefunden" in der Konsole ausgegeben. Den Teil mit dem Polygon hab ich schon wieder rausgenommen.


----------



## Marco13 (27. Mrz 2008)

Falls es ein JPG Bild mit ähnlicher Kompression wie das gepostete war, ist Andreys Einwand gerechtfertigt. Wenn du es mit IrfanView offen hast, vergrößere es mal bis zum Anschlag und klicke dann auf einige Pixel, die "schwarz aussehen". Dann wird (solange die Maustaste gedrückt ist) in der Titelleiste das RGB angezeigt, und da sind einige "schwarze" Pixel eher ein (30,30,30)-Grau. Probier' auf jeden Fall mal sowas wie

```
if(farbe.getGreen() <= 30 && farbe.getBlue() < 30 && farbe.getRed() < 30) ...
```


----------



## 0x7F800000 (27. Mrz 2008)

Oder mach das bild einfach in paint auf, und versuche eine "homogene" fläche mit dem floodfill auszufüllen. Du wirst feststellen, dass du in dem bild keine zwei pixel gleicher farbe findest  (in der umgebung vom kreis zumindest) Du musst es schon abschätzen, zB so wie Marco13 es vorgeschlagen hat  :toll:


----------



## pyr0t0n (27. Mrz 2008)

ja ok kann man natürlich machen. Das es nicht unbedingt komplett schwarz ist ist auch klar muss dann halt mal sehen wie ich das umgesetzt kriege das ich da nen Polynom raus bekomme.


----------



## 0x7F800000 (27. Mrz 2008)

polynom? Spline oder Beziers oder was meinst du denn konkret?


----------



## pyr0t0n (27. Mrz 2008)

polygon sry vertippt ^^


----------

