# Image RGB Werte auslesen und vergleichen



## BRoll (28. Okt 2012)

Also ich hab grad ein Problem mit dem auslesen
von RGB Werten bei Images.

Ich möchte von jedem Pixel des Bilds die Farbe auslesen,
und mit einer definierten Farbe vergleichen.
Es soll also so eine Vorlage sein, aber es funktioniert nicht richtig.


```
Image m=Toolkit.getDefaultToolkit().getImage( filename );		
	   
		BufferedImage map=new BufferedImage(900,679,BufferedImage.TYPE_INT_RGB); 
		map.getGraphics().drawImage(m,0,0,null);
	
		for(int i=0; i<900; i++)
		{
			for(int h=0; h<679; h++)
			{
				int rgb=map.getRGB(i, h);
		      
		if(rgb==new Color(0,0,255).getRGB())
				{
					//Blau
				} 
		
}         

 }
```

Die Pixel sind definitiv alle von der Farbe: 0,0,255, habs mit PS
mehrmals überprüft. Hab mit dem Bild auch schon als PNG,
Gif usw getestet.

Wenn ich mir jetzt die Werte ausgeben lasse, erhalte ich immer:

Pixel:
-16777216 
Farbe:
-16776961

Woher kommt diese (kleine) Ungenauigkeit?

Wenn ich es andersrum mache, also so:

```
Color c=new Color(rgb);
if(c.getBlue()=255&&c.getRed()==0&&c.getGreen()==0)
{
}
```
dann gehts auch nicht. Bei der Variante
erhalte ich für alle 3 Werte 0.
Also Rot=0, Grün=0, Blau=0.


Jetzt bin ich ein bisschen verwirrt.

Weiß jemand von euch was ich falsch mache?

Und das Bild hat auch kein Alphakanal, wenn ichs aber mit TYPE_INT_ARGB
einlese ist der RGB Wert 0....

???:L


----------



## Ullenboom (28. Okt 2012)

Das sieht so aus, als ob du das Bild komprimiert speicherst, und zwar mit Verlust. JPEG hat Artefakte und da sind die Farben etwas anders.


----------



## BRoll (28. Okt 2012)

Genau deshalb hab ichs als PNG und als GIF gemacht,
beim letzteren explizit mit nur 6 verschiedenen Farben,
darunter eben das 0,0,255.

Hätte ichs als JPG dann wäre es logisch, aber bei den
Datentypen gibts ja so eine Komprimierung nicht.
Deshalb bin ich ja verwirrt.  ???:L


----------



## Ark (28. Okt 2012)

Mal davon abgesehen, dass dein Bild sehr imperformant durchlaufen wird: Bau mal ein paar Debugging-Zeilen ein.

```
int rgb=map.getRGB(i, h);
System.out.println(Integer.toHexString(rgb));
```
Ark


----------



## BRoll (28. Okt 2012)

Ark hat gesagt.:


> Mal davon abgesehen, dass dein Bild sehr imperformant durchlaufen wird: Bau mal ein paar Debugging-Zeilen ein.
> 
> ```
> int rgb=map.getRGB(i, h);
> ...




Das hab ich ja bei mir im Code, wenn ich hier poste
stören solche Debug Infos aber.

Sonst hätte ich euch die Werte ja garnicht nennen können, oder? 

Also in HEX angegeben wäre die Farbe 0, also Schwarz.
Das sieht eher nach einem Lese Fehler des Bildes aus,
obwohl ich vorher mir das Bild ausgeben lasse.
Scheint als wäre das BufferedImage noch leer, also Schwarz.


----------



## Ark (28. Okt 2012)

Gibt es einen Grund, warum du nicht ImageIO benutzt?

Ark


----------



## BRoll (28. Okt 2012)

Ark hat gesagt.:


> Gibt es einen Grund, warum du nicht ImageIO benutzt?
> 
> Ark




Was war das nochmal? 

Nein also mit ImageIO schreibe ich immer Bilder,
aber lesen hab ich mir angewohnt mit Toolkit.
Ich weiß nicht ich kam mit den Pfaden nicht zurecht,
wie ich das mit ImageIO korrekt einlese weiß ich grad nicht.

Und das andere hat bis jetzt immer funktioniert, bloß das Bild will er nicht xD


----------



## BRoll (28. Okt 2012)

Ok sry Leute, habs jetzt hinbekommen...

Ich kann immer noch nicht genau sagen worans lag,
aber habs jetzt einfach komplett neu gemacht.

Also Neues Projekt, da die Klasse rein, schön ein Frame erstellt,
dann Bild eingelesen, wenns Bild geladen wurde dann anzeigen,
und dann die Berechnung machen.

Dann gings auch.

Also lag am Ladevorgang und nicht am Bild selber oder sonstwas.

Ich war bloß mal wieder zu schnell....


----------



## Ullenboom (28. Okt 2012)

ImageIO (Reading/Loading an Image) hat zumindest den Vorteil, dass beim Lesen ein BufferedImage rauskommt, das hat direkt getRGB(...). Teste das doch mal so.


----------

