# Zugriff auf die Farbwerte eines Bildes



## Heidilein (25. Nov 2005)

Hi.
Ich komm sofort zum Thema: Ich hab ein Programm mit swing geschrieben, womit man Bilder laden kann. Die Bilder die ich habe, sind aber sehr dunkel. Ich möchte diese aufhellen bzw. normieren. Nur weiss ich nicht wo ich anfangen soll. 
Wie kann ich auf die Farbwerte bzw. Grauwerte eines Bildes zugreifen? Gibt es da ein Package oder ne Methode oder Ähnliches?


----------



## The_S (25. Nov 2005)

Jo, gibt schon vorgefertigte Filter (einfach mal im Forum suchen). Kannst dir aber auch die Methoden selber schreiben. Kleine Ansatz für das aufhellen

- Jeden Pixel des Bildes in zwei verschachtelten Schleifen durchgehen und holen mit buffimg.getRGB(x, y)
- daraus eine neue Color erstellen, von der dann die rot grün und blau werte (getRed(), getGeen(), getBlue()) auslesen
- diese dann um jeweils den selben wert erhöhen
- die Farbe auf den Pixel mit setRGB zurückschreiben

für Graustufen könnteste einfach den mittlerwert des Pixels ermitteln und dann alle farben auf diesen Ton setzen. Also (Rot + Grün + Blau) / 3


----------



## Beni (25. Nov 2005)

Guck dir auchmal "java.awt.image.ImageFilter" an. Zusammen mit der Source eines Images (Image#getSource) und einer FilteredImageSource kann man einen neuen ImageProducer erstellen. Mit "Toolkit#createImage" kriegt man dann wieder ein Bild (jedenfalls in der Theorie :bae


----------



## Heidilein (27. Nov 2005)

Also vorgefertigte Filter helfen mir eigentlich wenig. Ich hab ne Formel, wo ich den höchsten und den niedrigsten Grauwert benötige. Wie kann ich die raus finden und auf sie zugreifen?


----------



## lin (27. Nov 2005)

Geh mit ner Schleife durchs ganze Bild und lies von jedem Pixel mit getRGB(x, y) den Wert raus, dann erstellst du eine neue Color davon und summierst die einzelnen Farbanteile auf und der Wert der am nächsten bei 0 ist ist der dunkleste Grauwert der der am nächsten bei 3*255 ist der hellste... (oder was meinst du mit höchstem und niedrigstem Grauwert :? )


----------



## Heidilein (28. Nov 2005)

Also ehrlich gesagt hab ich nix verstanden. Zumindest kann ich mir nicht vorstellen wie ich diese Schleife implementieren soll. Ich weiss einfach nicht wie ich die Werte der Pixel auslesen soll. Kannst du mir das evtl. so skizzenhaft hin schreiben, so dass ich mir wenigstens die Schleife mal ansehen kann?


----------



## lin (28. Nov 2005)

also folgende Methode schreibt dir die Summe der RGB Werte eines jeden Pixels in ein 2D array, dabei steht die erste Dimension für die Zeilen und die zweite für die Spalten. _path_ ist der pfad wo dein Bild liegt...
Bei einem grauen Bild werden die rot grün und blau -Anteile eines Pixels jeweils gleich gross sein, du könntest also auch nur einen der drei Werte ins Array speichern. Anschliessend kannst du den Maximal Wert im Array suchen (= hellstes Pixel) und das Minimum (= dunklestes Pixel). Danach wendest du deine Formel auf die Werte des Arrays an und schreibst die Werte des Arrays mit setRGB(x,y) zurück ins Bild....

```
// rgb values of every px of image are loaded into 2d array [x][y]
	private void loadImage() {
		try {
			BufferedImage img;
			BufferedInputStream in = new BufferedInputStream(
					new FileInputStream(path));
			img = ImageIO.read(in);
			W = img.getWidth();
			H = img.getHeight();

			// 2d array is initialized
			values = new int[H][W];
			
			// rgb values are read out and put into array
			for (int y = 0; y < H; y++) {
				for (int x = 0; x < W; x++) {
					Color col = new Color(img.getRGB(x, y));
					values[y][x] = ( col.getRed() + col.getGreen() + col.getBlue() );
				}
			}
		} catch (IOException ioe) {
			new JErrorHandler(ioe);
		}
	}
```


----------

