【问题标题】:BufferedImage disable dithering when reducing color using custom ColorModel?BufferedImage 在使用自定义 ColorModel 减少颜色时禁用抖动?
【发布时间】:2017-10-20 15:58:20
【问题描述】:

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

 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 使用抖动来减少颜色。是否可以禁用这种抖动?

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

【问题讨论】:

    标签: java bufferedimage graphics2d dithering


    【解决方案1】:

    将图像绘制到Graphics2D 对象时,可以使用RenderingHints 控制渲染的各个方面。您应该能够使用Graphics2D.setRenderingHintsetRenderingHints 方法禁用抖动,将KEY_DITHERINGVALUE_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 tutorial 了解更多信息。

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

    【讨论】:

    • 在这种特殊情况下使用渲染提示不起作用(在其他/大多数情况下它确实起作用),忽略 KEY_DITHERING。互联网上有一些关于这个问题的主题,但没有一个提出具有良好性能的解决方案。试试看吧。
    • 我刚刚看到你编辑了你的问题 ;-) 我要看看你的课程,它们看起来不错,因为使用了有利于性能的栅格。我会及时通知你!
    • 干杯@haraldK,今天早上花了一点时间才弄清楚,但是在找到你的maven依赖之后一切都很顺利。我将 CopyDither 与我的颜色模型一起使用,它生成了一个未抖动的版本。它也非常快,我对每个像素的 hacky setRgb(getRgb) 都慢了 50%。再次感谢!
    • @TinusTate 好东西!自从我编写该代码以来已经有一段时间了,因此请随时提出改进建议。 ?
    • 我正计划浏览所有与图像相关的课程,我已经看到了一些有趣的课程。它们还很好地说明了如何使用一些更高级的 java 图像类。为创建如此有用的库而欢呼。
    猜你喜欢
    • 2014-04-29
    • 2016-04-13
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多