0

我正在使用自定义调色板(换句话说,自定义颜色模型)创建图像:

 BufferedImage img = new BufferedImage(orgImg.getWidth(), orgImg.getHeight(),
      BufferedImage.TYPE_BYTE_INDEXED,
      cm);
 Graphics2D g2 = img.createGraphics();
    g2.drawImage(orgImg, 0, 0, null);
    g2.dispose();

请注意,“cm”变量是我的自定义颜色模型,带有 256 种颜色的调色板。

“orgImg”变量是全彩色(24 大 argb)图像。

上面的代码使用颜色模型中定义的调色板生成具有 256 种颜色的“orgImg”副本。

这很好用。

但是java使用抖动来减少颜色。是否可以禁用这种抖动?

请注意,我需要使用自己的调色板,以便最终图像匹配特定的调色板。

4

1 回答 1

2

将图像绘制到Graphics2D对象中时,可以使用RenderingHints 控制渲染的各个方面。您应该能够使用Graphics2D.setRenderingHintorsetRenderingHints方法禁用抖动,将KEY_DITHERINGandVALUE_DITHER_DISABLE值作为参数传递:

Graphics2D g2 = img.createGraphics();
// Disable dithering
g2.setRenderingHint(RenderingHint.KEY_DITHERING, RenderingHint.VALUE_DITHER_DISABLE);
g2.drawImage(orgImg, 0, 0, null);
g2.dispose();

有关更多信息,请参阅Java2D 教程

PS:请注意,方法/类被命名为“提示”。

这可能不再是一个问题,但在过去我经历过使用上面的提示禁用抖动不起作用。也无法指定要使用的抖动算法,通常只使用“有序”或“菱形”模式抖动。

因此,我为此使用了我自己的各种抖动算法版本。请参阅CopyDither(它对每个像素进行最接近的匹配查找,这可能是您想要的)和DiffusionDither(它实现了“Floyd-Steinberg”误差扩散抖动)。上述两种实现都依赖于颜色值的快速反向查找。不幸的是,默认IndexColorModel不做快速反向查找。所以我也为这种情况实现了一个特殊的类,请参阅InverseColorMapIndexColorModel类。

用法:

BufferedImage img = new BufferedImage(orgImg.getWidth(), orgImg.getHeight(), BufferedImage.TYPE_BYTE_INDEXED, cm);
CopyDither noDither = new CopyDither(new InverseColorMapIndexColorModel(cm)); // cm must be IndexColorModel
noDither.filter(orgImg, img);
于 2017-10-21T12:46:38.200 回答