【问题标题】:Disable dithering on a TYPE_BYTE_INDEXED BufferedImage在 TYPE_BYTE_INDEXED BufferedImage 上禁用抖动
【发布时间】:2014-04-29 06:46:57
【问题描述】:

我有一个 256 色的 BufferedImage,我想在其上绘制另一个 BufferedImage(> 256 色)。 Java 的默认行为是抖动在低颜色模型中无法表示的颜色。我想禁用它(从而选择低颜色模型中可用的下一个最佳颜色),所以我尝试使用 RenderingHints 来指定新的渲染行为,但它不起作用:

public BufferedImage filter(BufferedImage src) {
    BufferedImage convertedImage = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_INDEXED);
    Graphics2D g2d = (Graphics2D) convertedImage.getGraphics();
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
    g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
    g2d.drawImage(src, 0, 0, null);
    return convertedImage;
}

想法?

更新:

我通过逐像素绘制新图像解决了这个问题,这可能不是很快,但它可以工作。详情见我的回答。

【问题讨论】:

  • 乍一看代码,我想说您必须在绘制图像之前设置任何渲染提示。但是您想要实现的目标并不完全清楚:不能 表示的颜色应该如何处理?应该选择“最接近”的颜色吗?这可能很棘手......
  • 哦,是的,两条 'RenderingHint' 行原本在 'drawImage' 行之前。我更正了。
  • @Victor-PhilippNegoescu 您应该发布更新作为您自己问题的答案,并将其标记为已接受。您将获得奖励积分,并且该问题将不再出现在“未回答”队列中。 :-) PS:希望我知道为什么你的原始代码不起作用,但我之前也看到过同样的问题,最后得到了a similar method,就像你描述的那样。
  • @haraldK 谢谢,我必须在发布问题后至少等待 8 小时才能自己回答。

标签: java image-processing bufferedimage dithering


【解决方案1】:

我通过逐像素绘制新图像解决了这个问题,这可能不是很快,但它确实有效:

public BufferedImage filter(BufferedImage src) {
    BufferedImage convertedImage = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_INDEXED);
    for (int x = 0; x < src.getWidth(); x++) {
        for (int y = 0; y < src.getHeight(); y++) {
            convertedImage.setRGB(x, y, src.getRGB(x, y));
        }
    }
    return convertedImage;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多