# Farbtiefe eines BufferedImage verringern



## babuschka (12. Jul 2007)

Ich würde gerne für eine kleine Utility die Farbtiefe von Bildern verringern können, also z.B. von einem 24Bit JPEG in ein 8Bit mit 256 Farben oder sogar nur 4 Bit.
Kann man das mit einem Filter machen?


----------



## dieta (12. Jul 2007)

Versuch's mal so:

```
BufferedImage input = ...; //Ausgangsbild ,kann auch ein anderer Typ sein (z.B. Image)
BufferedImage output = new BufferedImage(input.getWidth(), input.getHeight(), BufferedImage.TYPE_3BYTE_BGR); //Den Typ des Bildes kann man nach seinen Bedürfnissen anpassen
output.getGraphics().drawImage(input, 0, 0, null);
//Hier kann jetzt das konvertierte Bild (output) weiterverarbeitet werden.
```


----------



## Marco13 (12. Jul 2007)

Und wo wird da jetzt die Farbtiefe geändert? 
Um das zu machen könnte man wirklich einen Filter verwenden. Nur: Welche Farbe in welche andere Farbe verwandelt werden soll, ist dabei erstmal nicht klar

```
image = createImage(new FilteredImageSource(ImageIO.read(file).getSource(), new MeinFilter()));
class MeinFilter extends RGBImageFilter 
{
    public MeinFilter() 
    {
        canFilterIndexColorModel = true;
    }
    public int filterRGB(int x, int y, int rgb) 
    {
        gib die gewünschte Farbe zurück...
    }
}
```


----------



## dieta (13. Jul 2007)

Die Farbtiefe wird dort geändert:

```
BufferedImage output = new BufferedImage(input.getWidth(), input.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
```
Das neue BufferedImage kann eine andere Farbtiefe haben als das "alte" Bild.
Wenn du einzelne Fraben einzelnen anderen Farben zuordnen willst, musst du warscheinlich den Konvertiervorgang selbst programmieren, was aber auch geht.
Dann musst du eben mit dem WritableRaster des BufferedImages arbeiten. Damit kannst du ein Bild pixelgenau modifizieren.
Bloß schneller wird das ganze dann warscheinlich nicht gehen...


----------

