Bild in Graustufen umwandeln

Benzol

Erfahrenes Mitglied
'n abend,
ich probiere schon den ganzen Tag, Farbbilder möglichst unkompliziert in ein Graustufenbild umzuwandeln, um es dann wieder Bräunlich einzufärben. Quasi ein Sepiafarbton.

Nur ich bekomme es nicht hin, über einen Filter das Bild so zuverändern, das es Grau wird. Ihr könnt Euch sicherlich vorstellen, das man die seltsamsten Effekte mit diesen Farbfiltern machen kann... und ich glaube, ich habe heute schon alles erlebt :) Nur das richtige ist bisher ausgeblieben. Gibt es einen Integrierten Filter, der das Bild in Graustufen wandelt, oder muss ich das selber machen. Und, wie wandel ich das Bild um? Bin da echt ratlos :rolleyes:
 
Hallo!

Schau mal hier:
Code:
package de.tutorials;

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"));

    }

}

Gruß Tom
 
Verstehe ich das richtig, das bei dieser Methode ein Bild vom Typ TYPE_BYTE_GRAY erzeugt wird? Das müssten ja wiederrum in ein RGB Bild gewandelt werden, damit ich das Rötlich einfärben kann.
 
Hallo!

Dann verwende eben:
Code:
  BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(),
                BufferedImage.TYPE_INT_RGB);
Geht auch...

Gruß Tom
 
Das habe ich mir dann auch gedacht, aber ich kann meinen Filter nicht auf ein BufferedImage anwenden sagt er mir.

Code:
ImageFilter sepia = new SepiaImageFilter();
scaledImage = createImage(new FilteredImageSource(scaledImage.getSource(), sepia));

scaledImage sollte also vorher in Graustufen umgewandelt werden, dammit ich keine hässlige Farbbrühe bekomme, wenn ich das Bild umfärbe. Oder habe ich da einen Denkfehler?
 
>Btw. es gibt auf einen BufferedImageFilter
Daran hätte ich auch selber denken könne. Ich danke dir... habe jetzt Feierabend, probiere ich morgen aus ;)

EDIT:
Umh... er sagt jetzt das mein Filter ein Inkompatbilen Typ hat.

Code:
BufferedImageFilter sepia = new SepiaImageFilter();


class SepiaImageFilter extends RGBImageFilter   
{               
    public int filterRGB(int _x, int _y, int _rgb)        
    {
        int transparenz = _rgb & 0xff000000; // ARGB (Transparenz, Rot, Grün, Blau)                     
        int rotstich = _rgb & 0x007a664b;    // ARGB (Transparenz, Rot, Grün, Blau) 
        return transparenz | rotstich;              
    }                       
}

Woran liegt das?
 
Zuletzt bearbeitet:
Hmm, so wie ich mir das Vorgestellt habe, scheint es dann doch nicht zu funktionieren.
Ich habe leider wirklich nicht soviel Ahnung davon, ich hoffe, jemand von Euch kann mir helfen, ein Farbbild in ein Sepia-Bild umzuwandeln.
 

Anhänge

  • vorschau.jpg
    vorschau.jpg
    106,7 KB · Aufrufe: 440
Hallo!

Schau mal hier:
Code:
/**
 * 
 */
package de.tutorials;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.FilteredImageSource;
import java.awt.image.RGBImageFilter;
import java.io.File;

import javax.imageio.ImageIO;

/**
 * @author Tom
 * 
 */
public class SepiaImageFilterExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        BufferedImage src = ImageIO.read(new File("c:/me_new.jpg"));
        BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(),
                BufferedImage.TYPE_INT_RGB);
        FilteredImageSource imageSource = new FilteredImageSource(src
                .getSource(), new RGBImageFilter() {
            public int filterRGB(int x, int y, int rgb) {
                int alpha = (rgb >> 24) & 0xFF;
                int r = (rgb >> 16) & 0xFF;
                int g = (rgb >> 8) & 0xFF;
                int b = (rgb) & 0xFF;

                double sepiaValue = (0.298912 * r + 0.586611 * g + 0.114478 * b) / 255;

                rgb = (alpha << 24) | (((int) (sepiaValue * 240)) << 16)
                        | (((int) (sepiaValue * 200)) << 8)
                        | ((int) (sepiaValue * 145));
                return rgb;
            }
        });
        Image image = Toolkit.getDefaultToolkit().createImage(imageSource);
        dest.getGraphics().drawImage(image, 0, 0, null);
        ImageIO.write(dest, "jpeg", new File("c:/me_sepia.jpg"));
    }
}

Btw. häng doch bitte noch eine "gesepiate" Version deines Fotos an... ;-)

Gruß Tom
 

Anhänge

  • me_sepia.jpg
    me_sepia.jpg
    17,5 KB · Aufrufe: 270
Hey Tom, das hat wunderbar funktioniert :)
Wenn du jetzt noch so freundlich wärst, und mir die Berechnungen erklären würdest, mit denen du den Farbton erreichst, wäre ich dir zu ewigem Dank verpflichtet ;)
 
Zurück