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

Вы можете использовать метод convert8 в классе ConvertUtil.

Подробнее см. here.

+0

Я не мог использовать ConvertUtil.convert8, поэтому мне пришлось бы импортировать этот класс, но я не смог найти код импорта. Вы случайно делаете то, что/где оно? – Dak31

4

Для этого вы можете использовать JAI (Java Advanced Imaging), официальную библиотеку изображений Sun (now Oracle).

ColorQuantizerDescriptor показывает выбор процессов квантования, которые вы можете применить.

+0

У вас есть образец кода? http://stackoverflow.com/questions/15312921/how-to-use-colorquantizerdescriptor –