BufferedImage を 8 ビット色に変換する方法を見つけようとして、ImageConverter クラスを調べていましたが、これを行う方法がわかりません。私もインターネットを検索していましたが、簡単な答えが見つかりませんでした。それらはすべて8ビットのグレースケール画像について話していました。画像の色を8ビットに変換したいだけです...他には何もありません。サイズ変更も何もありません。これを行う方法を教えてくれる人はいますか?
8690 次
3 に答える
5
これを行うには、公式の Sun (現在の Oracle) イメージ ライブラリである JAI (Java Advanced Imaging) を使用できます。
ColorQuantizerDescriptorは、適用できる量子化プロセスの選択を示します。
于 2012-06-16T09:10:39.553 に答える
3
G-Man の Uber ソフトウェア エンジニアリング ブログの記事「Transparent gifs in Java」からのこのコード スニペットはうまく機能します。
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);
}
于 2012-06-16T09:17:59.583 に答える
2
convert8
メソッドをConvertUtil
クラスで使用できます。
詳細については、こちらをご覧ください。
于 2012-06-16T09:03:40.993 に答える