2012-06-16 6 views
8

Ich habe mir die ImageConverter-Klasse angesehen und versucht, herauszufinden, wie man ein BufferedImage in eine 8-Bit-Farbe umwandelt, aber ich habe keine Ahnung, wie ich das machen würde. Ich suchte auch im Internet und konnte keine einfache Antwort finden, sie sprachen alle über 8-Bit-Graustufenbilder. Ich möchte einfach die Farben eines Bildes in 8 Bit konvertieren ... nichts anderes, keine Größenanpassung, nichts. Kann mir jemand sagen, wie man das macht?Wie konvertiert man ein BufferedImage in 8 Bit?

+0

Sie müssen wahrscheinlich ein Quantisierungsalgorithmus wählen, das heißt. etwas, das die Farbpalette Ihrer Bilder in eine 256-er-Palette umwandelt. – PhiLho

+0

Was meinen Sie mit der Umwandlung der Farben eines Bildes in 8-Bit? Ich nehme an, Sie möchten den Farbraum reduzieren? Möchten Sie eine Farbquantisierung durchführen? – Behe

+0

Könnt ihr mich auf eine Bibliothek/API hinweisen? Ich habe keine Ahnung, wovon du redest. Das hört sich auch so an, als könnte ich meine eigene Palette erstellen, die nach Möglichkeit besser wäre. –

Antwort

2

Dieser Code-Schnipsel aus dem Artikel "Transparent gifs in Java" at G-Man's Uber Software Engineering Blog funktioniert gut:

public static void main(String[] args) throws Exception { 
    BufferedImage src = convertRGBAToIndexed(ImageIO.read(new File("/src.jpg"))); 
    ImageIO.write(src, "gif", new File("/dest.gif")); 
} 

public static BufferedImage convertRGBAToIndexed(BufferedImage src) { 
    BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_INDEXED); 
    Graphics g = dest.getGraphics(); 
    g.setColor(new Color(231, 20, 189)); 

    // fill with a hideous color and make it transparent 
    g.fillRect(0, 0, dest.getWidth(), dest.getHeight()); 
    dest = makeTransparent(dest, 0, 0); 

    dest.createGraphics().drawImage(src, 0, 0, null); 
    return dest; 
} 

public static BufferedImage makeTransparent(BufferedImage image, int x, int y) { 
    ColorModel cm = image.getColorModel(); 
    if (!(cm instanceof IndexColorModel)) 
     return image; // sorry... 
    IndexColorModel icm = (IndexColorModel) cm; 
    WritableRaster raster = image.getRaster(); 
    int pixel = raster.getSample(x, y, 0); // pixel is offset in ICM's palette 
    int size = icm.getMapSize(); 
    byte[] reds = new byte[size]; 
    byte[] greens = new byte[size]; 
    byte[] blues = new byte[size]; 
    icm.getReds(reds); 
    icm.getGreens(greens); 
    icm.getBlues(blues); 
    IndexColorModel icm2 = new IndexColorModel(8, size, reds, greens, blues, pixel); 
    return new BufferedImage(icm2, raster, image.isAlphaPremultiplied(), null); 
} 
+0

Arbeitete gut, musste nur den Transparenzteil entfernen. –

1

Sie können die convert8 Methode in der ConvertUtil Klasse verwenden.

Für Details schauen Sie sich here an.

+0

Ich konnte ConvertUtil.convert8 nicht verwenden, also müsste ich diese Klasse importieren, aber ich konnte den Importcode nicht finden. Tust du zufällig was/wo es ist? – Dak31

4

Sie können dazu JAI (Java Advanced Imaging), die offizielle Sun (jetzt Oracle) Bildbibliothek verwenden.

Die ColorQuantizerDescriptor zeigt die Auswahl der Quantisierungsprozesse, die Sie anwenden können.

+0

Haben Sie einen Beispielcode? http://stackoverflow.com/questions/15312921/how-to-use-colorquantizerdescriptor –

Verwandte Themen