# BufferedImage - Farbton verändern



## 0001001 (24. Feb 2010)

Hallo,

ich habe ein Bild als BufferedImage vorliegen. Nun würde ich gerne den Farbton verändern, d.h. bspw. den RGB Wert jedes Pixels leicht verändern. 
Kann mir jemand sagen wie man sowas in Java macht?
Als Beispiel hab ich mal ein Originalbild und ein verändertes Bild angehängt, so wie ich es gerne verändern würde.

Vielen Dank schon mal!


----------



## AlexSpritze (24. Feb 2010)

Wenn du das BufferedImage Objekt hast, kannst du mit der Methode .seRGB(x, y, rgb) den RGB-Wert an jeder Stelle des Bildes neu setzen. Mit .getRGB(x, y) holst du ihn dir vorher. x und y sind dabei die Koordinaten deines Bildes. rgb ist der RGB-Wert als int:


```
int rgb = rot << 16 | gruen << 8 | blau; // einzelnen Werte zwischen 0 und 255 inkl.
```


----------



## 0001001 (24. Feb 2010)

Hm, ja das hab ich schon probiert ist aber performancetechnisch sehr schlecht. Gibts andere Möglichkeiten?


----------



## Marco13 (24. Feb 2010)

Kompakter und ""eleganter"" ginge es vielleicht mit ColorConvertOp (Java Platform SE 6). Vieeeel schneller als mit ein paar Additionen und bitshifts und setRGB geht es kaum. Außer, wenn man direkt ein BufferedImage.TYPE_INT_RGB erstellt, sich davon das Raster und davon den DataBuffer und davon das Data als int[] abholt, und da seine Daten reinschreibt. Flexibel und elegant ist was anderes, aber _schnell_ ist das


----------



## 0001001 (25. Feb 2010)

Hm,
ich habs mal so probiert und das ist verdammt langsam. Vielleicht mach ich auch nur was falsch. Mit der Methode will ich zu jedem RGB Wert jedes Pixels einen Wert addieren:

```
private static BufferedImage modifyPixelValues(BufferedImage image, int random) {

        for (int i = 0; i < image.getWidth(); i++) {
            for (int j = 0; j < image.getHeight(); j++) {
                int pixel = image.getRGB(i, j);


                int alpha = ((pixel >> 24) & 0xff);
                int red = (pixel >> 16) & 0xff;
                int green = (pixel >> 8) & 0xff;
                int blue = (pixel) & 0xff;
                if (alpha + random > 255) {
                    while (alpha < 255) {
                        alpha = alpha++;
                    }
                } else if (alpha + random < 0) {
                    while (alpha > 0) {
                        alpha = alpha--;
                    }
                } else {
                    alpha = alpha + random;
                }

                if (red + random > 255) {
                    while (red < 255) {
                        red = red++;
                    }
                } else if (red + random < 0) {
                    while (red > 0) {
                        red = red--;
                    }
                } else {
                    red = red + random;
                }

                if (green + random > 255) {
                    while (green < 255) {
                        green = green++;
                    }
                } else if (green + random < 0) {
                    while (green > 0) {
                        green = green--;
                    }
                } else {
                    green = green + random;
                }

                if (blue + random > 255) {
                    while (blue < 255) {
                        blue = blue++;
                    }
                } else if (blue + random < 0) {
                    while (blue > 0) {
                        blue = blue--;
                    }
                } else {
                    blue = blue + random;
                }
                int rgb = (alpha << 24) | (red << 16) | (green << 8) | blue;
                             image.setRGB(i, j, rgb);

            }
        }
        return image;
    }
```


----------



## Marco13 (25. Feb 2010)

Ähja... so ... Was ... sollen diese if-Abfragen und Schleifen da drin bewirken?


EDIT: Nur als Beispiel: Sowas wie

```
while (green < 255) {
    green = green++;
}
```
sollte vielleicht eher

```
green = 255;
```
sein, aber... je nachdem was da raus kommen soll, könnte man das 'random' ggf. gleich mit reinrechnen...


----------

