2012-06-16 14 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

これを行うには、公式のSun(現在Oracle)イメージライブラリであるJAI(Java Advanced Imaging)を使用できます。

ColorQuantizerDescriptorには、適用可能な量子化プロセスの選択肢が示されています。

+0

サンプルコードがありますか? http://stackoverflow.com/questions/15312921/how-to-use-colorquantizerdescriptor –

関連する問題