簡體   English   中英

如何將BufferedImage轉換為8位?

[英]How to convert a BufferedImage to 8 bit?

我正在查看ImageConverter類,試圖弄清楚如何將BufferedImage轉換為8位顏色,但我不知道如何做到這一點。 我也在互聯網上搜索,我找不到簡單的答案,他們都在談論8位灰度圖像。 我只是想將圖像的顏色轉換為8位......沒有別的,沒有任何調整大小。 有誰介意告訴我如何做到這一點。

您可以使用JAI(Java Advanced Imaging),即官方Sun(現在的Oracle)圖像庫來實現這一目標。

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

G-Man優步軟件工程博客文章“透明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);
}

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

詳情請看這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM