# Graustufe programmieren



## hansblub (25. Feb 2008)

Hallo! 
ich brauche ein Graustufen-Programm, und nicht, wie es bei java vorgegeben ist, durch eine eigene Klasse, sondern diese Klasse muss ich selbst programmieren.
Hiermit kann man ja ein Graustufenbild erzeugen, aber dies muss ich nun selbst programmieren.


```
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.File;

import javax.imageio.ImageIO;

public class GrayScaleConversionExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        BufferedImage src = ImageIO.read(new File("c:/Sonnenuntergang.jpg"));
        BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(),
                BufferedImage.TYPE_BYTE_GRAY);
        ColorConvertOp grayScaleConversionOp = new ColorConvertOp(ColorSpace
                .getInstance(ColorSpace.CS_GRAY), null);

        grayScaleConversionOp.filter(src, dest);
        ImageIO.write(dest, "jpeg", new File("c:/Sonnenuntergang_gray.jpg"));

    }

}
```


Ich weiß, dass alle Farbwerte, (R,G,B) gleich sein müssen um einen Grauton zu erzeugen. 
Man muss also erst die Rote Farbe selektieren:

```
for (int i = 0; i < (int)(höhe*breite); i++) {
      r = pixelFeld[i] & 0xffff0000;
    }
```
danach die Blaue und Grüne oder sehe ich da etwas völlig falsch?? so muss man diese dann doch wieder zu einem Bild zusammenfügen, aber ich weiß nicht genau wie... Habe mich da schon sehr lange mit befasst, komme damit aber nicht wirklich richtig auf was produktives raus...

könntet ihr mir vl helfen??
wäre sehr nett... und wenn es auch nur ein internet-link ist, wo ihr wisst wo es erklärt steht. ich habe noch ncihts gefunden.

gruss

hansblub


----------



## Gast (25. Feb 2008)

hier ist ein delphi source der das macht:
http://www.delphi-treff.de/tipps/grafik/tipp/535/


----------



## Gast (25. Feb 2008)

P.S. http://de.wikipedia.org/wiki/Grauwert


----------



## Gast (25. Feb 2008)

P.S. http://de.wikipedia.org/wiki/Grauwert


----------



## hansblub (26. Feb 2008)

danke erstmal für die schnelle antwort.
da ich ein ziemlicher Anfänger in diesem Gebiet bin sagt wir der Quellcode ohne erklärung leider nciht sehr viel.
die formel für den Grauwert kannte ich auch schon, aber trz danke.

ich weiß auch was ich machen muss, aber nicht wie ich es in java umsetzen kann, weil ich leider noch nicht die erfahrung darin habe.

ich weiß also: 
-rot, blau und grün müssen selektiert werde
-diese werte in folgende formel einsetzen: B*0.11+G*0.59+R*0.3
-und dann bzw wie genau (wenn es eben geht mit erklärung) setze ich dies in java um??


----------



## Gast (26. Feb 2008)

Ja dann hast du doch alles was du brauchst, wo kommst du denn nicht weiter?

Bzw. zeig mal was du hast.

Liegt es am Lesen der RGB Werte? Am Umrechnen mit der Formel?


----------



## Gast (26. Feb 2008)

Ich kann dir ja mal so kurz aufschreiben was du machen musst und du kannst dann sagen was du nicht hinbekommst:

1. Du musst in einer schleife oder auch zwei durch die pixel gehen

2. Dann den jeweiligen r, g und b wert bestimmen

3. Den Graustufen wert aus den rgb wert berechnene

4. Den Pixel auf den Graustufen wert setzen


----------



## Saxony (26. Feb 2008)

Hiho,

eine schnelle Lösung:


```
public static void main(String[] args) {

		BufferedImage image = null;
		BufferedImage image2 = null;
    int gray = 0;
		try {
			image = ImageIO.read(new File("test.png"));
		}
		catch (IOException ex) {
			ex.printStackTrace();
		}
		if (image != null) {
			
			image2 = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
			for (int x = 0; x < image.getWidth(); x++) {
				for (int y = 0; y < image.getHeight(); y++) {
										
					Color c = new Color(image.getRGB(x, y));
					
					gray = (int)(c.getRed() * 0.299 + c.getGreen() * 0.587 + c.getBlue() * 0.114);
					
					Color grayColor = new Color(gray, gray, gray);
					image2.setRGB(x, y, grayColor.getRGB());					
				}
			}
		}
		
		try { ImageIO.write(image2, "jpeg", new File("result.jpg")); }
		catch (IOException ex) { ex.printStackTrace(); }
	}
```

bye Saxony


----------

