【问题标题】:How to convert a BufferedImage to 8 bit?如何将 BufferedImage 转换为 8 位?
【发布时间】:2012-06-19 04:43:26
【问题描述】:

我正在查看 ImageConverter 类,试图弄清楚如何将 BufferedImage 转换为 8 位颜色,但我不知道该怎么做。我也在互联网上搜索,我找不到简单的答案,他们都在谈论 8 位灰度图像。我只是想将图像的颜色转换为 8 位......没有别的,没有调整大小没有。有没有人介意告诉我如何做到这一点。

【问题讨论】:

  • 您可能必须选择一种量化算法,即。将图像的颜色范围转换为 256 个条目的调色板。
  • 将图像的颜色转换为 8 位是什么意思?我猜你想减少色彩空间?是否要执行颜色量化?
  • 你们能给我指出某种库/API 吗?我不知道你在说什么。听起来我也可以创建自己的调色板,如果可能的话会更好。

标签: java image image-processing bufferedimage 8-bit


【解决方案1】:

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

详情请看here

【讨论】:

  • 我无法使用 ConvertUtil.convert8,所以我必须导入该类,但我找不到导入代码是什么。你是不是碰巧做了什么/在哪里?
【解决方案2】:

"Transparent gifs in Java" at G-Man's Uber Software Engineering Blog 文章中的这段代码 sn-p 运行良好:

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

【讨论】:

  • 效果很好,只需要去掉透明部分。
【解决方案3】:

您可以使用 Sun(现在的 Oracle)官方图像库 JAI(Java Advanced Imaging)来做到这一点。

ColorQuantizerDescriptor 显示您可以应用的量化过程的选择。

【讨论】:

猜你喜欢
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 2013-09-26
  • 2017-12-15
  • 1970-01-01
相关资源
最近更新 更多