如何一个BufferedImage转换为8位?(How to convert a BufferedI

2019-07-29 23:00发布

我一直在寻找在ImageConverter类,试图找出如何一个BufferedImage到8位颜色转换,但我不知道我会怎么做。 我也摸索互联网和我能找到没有简单的答案,他们都在谈论8位灰度图像。 我只是想图像的颜色转换为8位......不出意外,没有调整什么都没有。 有没有人能告诉我如何做到这一点。

Answer 1:

从文章这段代码“在Java中的GIF透明”在G-人的尤伯杯软件工程博客效果很好:

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);
}


Answer 2:

您可以使用JAI(Java高级图像),Sun官方(现在是Oracle)图像库来做到这一点。

该ColorQuantizerDescriptor显示您可以将量化工艺的选择。



Answer 3:

您可以使用convert8的方法ConvertUtil类。

有关详细信息看看这里 。



文章来源: How to convert a BufferedImage to 8 bit?