【问题标题】:Java Image Re-sizing - Nearest NeighborJava 图像大小调整 - 最近邻
【发布时间】:2014-11-15 12:16:13
【问题描述】:

我正在尝试使用 Java 重新调整图像大小,我需要获得使用 Photoshop 最近邻(保留硬边)重新调整大小时发生的确切效果。

问题是我从来没有得到完全相同的效果......

我尝试了以下方法:

1) java-image-scale by mortennobel lib

resampleOp.setFilter(ResampleFilters.getBoxFilter());

这表现不错,但会在图像中留下一些伪像,当 Photoshop 执行此操作时不会出现这些伪像。

2) 用于图像处理的 TwelveMonkeys 库。 (here is the github link) 效果也不好,PointFilter 完全破坏了里面的渐变,Box 过滤器做的事情和 mortennobel getBoxFilter 一样。

3) AWT AffineTransform,这是最糟糕的,完全不切实际的调整大小。

现在我很困惑,photoshop 的最近邻居的大小是否与名称的含义不同,或者所有其他库都做错了(在第二种情况下,什么是正确的库?)

这是 Photoshop 生成的前后图像

这是从 mortennobel 库中获取 BoxFilter 生成的图像。

我将图像放大了一点,以便您可以看到细节,实际上它们更小。 任何帮助都非常感谢:)我真的坚持这一点。

【问题讨论】:

  • mortennobel 库使用盒式过滤器,因此不是您要求的——最近邻。您是否考虑过自己编写代码?在没有任何过滤的情况下迭代原始图像像素并不难。
  • 嗯..我认为框过滤器和最近邻居是相同的。好吧,我已经考虑过了,但是我认为它可能会很慢,此外,应该有一个库可以做到这一点吗?不用花哨的过滤器,而是使用简单的过滤器,这就是我想要的。我觉得 Photoshop 的功能还有另一个名称,如果我知道的话,我会找到合适的库。
  • 您可能想要解释使用RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR 的结果与您想要达到的结果有多大不同(另请参阅today.java.net/pub/a/today/2007/04/03/…
  • @Marco13,其实刚刚解决了!!!谢谢!您想发布示例代码作为答案,以便我投票吗?或者如果你愿意,我可以自己做:)
  • 我只能根据链接站点的代码创建一个 sn-p,并猜测有助于解决您的问题的细节。您可以回答自己的问题(否则我会尝试创建一个适当的答案,但我认为您的问题会更重要)

标签: java image-processing image-manipulation image-scaling


【解决方案1】:

非常感谢 Marco13 指出这一点!显然mortennobel lib不做最近邻, 相反,如果与 RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR 渲染提示一起使用,则 AWT 的 Graphics2D 可以。 这是适用于我的代码 sn-p 并生成了 Photoshop 的精确图像。

destinationBufferedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = destinationBufferedImage.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
g2.drawImage(sourceBufferedImage, 0, 0, newWidth, newHeight, null);
g2.dispose();

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2018-12-04
    • 2020-05-20
    • 2017-02-01
    • 1970-01-01
    • 2022-10-13
    • 2021-12-12
    • 2014-09-01
    • 2017-06-11
    相关资源
    最近更新 更多