2012-06-16 131 views
8

我在看ImageConverter類,試圖找出如何將BufferedImage轉換爲8位顏色,但我不知道如何做到這一點。我還在互聯網上搜索,找不到簡單的答案,他們都在談論8位灰度圖像。我只是想將圖像的顏色轉換爲8位......沒有別的東西,不會調整大小。有沒有人介意告訴我如何做到這一點。如何將BufferedImage轉換爲8位?

+0

你可能必須選擇一個量化算法,即。將圖像的顏色範圍轉換爲256個入口調色板。 – PhiLho

+0

將圖像的顏色轉換爲8位是什麼意思?我想你想減少色彩空間?你想要執行彩色量化嗎? – Behe

+0

你們能指點我一個圖書館/ API的某種?我不知道你在說什麼。這也聽起來像我可以創建我自己的調色板,如果可能的話,這將是更好的事件。 –

回答

2

從文章"Transparent gifs in Java" at G-Man's Uber Software Engineering Blog這段代碼工作得很好:

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

工作很好,只需要刪除透明部分。 –

1

可以在ConvertUtil類中使用convert8方法。

詳情看看here

+0

我無法使用ConvertUtil.convert8,因此我必須導入該類,但找不到導入代碼。你偶然會做什麼/它在哪裏? – Dak31

4

您可以使用JAI(Java高級圖像處理)這個官方的Sun(現在的Oracle)圖像庫來做到這一點。

ColorQuantizerDescriptor顯示了您可以應用的量化過程的選擇。

+0

你有一些示例代碼? http://stackoverflow.com/questions/15312921/how-to-use-colorquantizerdescriptor –