【问题标题】:java 1.4 good quality image resizejava 1.4 高质量图片调整大小
【发布时间】:2011-08-04 23:28:38
【问题描述】:

我们有一个使用 servlet 来调整图像大小的照片库 - 我们需要良好的性能和良好的质量,但我们就是做不到。另外,很遗憾,我们只有 java 1.4,这让我们几乎没有外部图像库(我发现的几乎所有东西都是 java 1.5+),而且 java 图像处理真的不好。

如果我使用这个:

private static BufferedImage scaleImage(BufferedImage orig, int type, int w, int h) {

    BufferedImage tmp = new BufferedImage(w, h, type);
    Graphics2D g2 = tmp.createGraphics();
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

    g2.drawImage(orig, 0, 0, w, h, null);
    g2.dispose();
    return tmp;
}

每次结果几乎相同(而且看起来很糟糕)或非常慢,这取决于所选的提示。我几乎阅读了所有关于在 java 中调整图像大小的文章(包括this one,但它没有帮助。

你有什么想法吗? java 1.4 的任何外部库是否快速且质量不错?有什么算法可以得到好的结果?

【问题讨论】:

  • 为什么任何人都坚持使用 9 年前的软件版本并被 7 年前的更新版本取代?
  • @Joachim,也许他们生活在岩石下? :D
  • @Joachim,好吧,我们与 SAP 门户合作,他们还没有升级到更高版本的 Java:/
  • 他们没有?我从来都不是 SAP 的忠实粉丝,但这太疯狂了。

标签: java image-processing java1.4


【解决方案1】:

您可以尝试像 JMagick 这样的 Image Magick 包装器。

【讨论】:

  • 非常感谢 :) JMagick 的唯一问题似乎是它无法从 InputStream 加载图像,这是我的情况:/ 好吧,我会努力解决这个问题 :)
  • 这可能是因为它将实际工作委托给命令行工具 ImageMagick。
  • @Izk 您可以将图像写入文件,在该文件上调用 Image Magick 并再次加载它。替代方案是 im4java,但似乎只有 Java 5+ 版本。
【解决方案2】:

Izk,鉴于您的要求,我同意 Thomas 的观点,您(可能)需要依赖外部/本地库。

如果您没有明确提及性能,我会建议使用 BICUBIC 插值以及 Chris Campbell 的增量缩放算法。 imgscalr library 实现了所有这些,但它确实需要 Java 5(使用 Enums)。话虽如此,您可以轻松地将代码复制到符合 Java 1.4 的实现中。

去看看Scalr class,滚动到最底部,然后复制最后两个方法。如果您想在 Java 中实现它,这就是完成 95% 所需的全部内容。

但是,如果在此之前您发现 Java 扩展性能无法接受,那么该实现对您没有帮助。您需要考虑使用 ImageMagick 等原生库。

幸运的是,ImageMagick 有 2 个流行的 Java 绑定,如果 JMagick API 不允许您处理 InputStreams,您可能会查看 im4java,它是 ImageMagick 命令行版本的直接包装器。我仔细研究了源代码,它看起来像用于包装“命令”以发送到命令行的核心 ImageCommand class 实用程序允许您在执行操作时将 BufferedImage 实例作为“图像”对象参数传递。

如果是这种情况,您可以使用 ImageIO.read(InputStream) 将图像数据读入 BufferedImage,然后再将其发送到 ImageMagick 以使用 im4java API 进行处理。

有一些建议可以帮助您到达目的地,希望对您有所帮助。

【讨论】:

  • 非常感谢您的详细分析,非常有帮助,非常感谢。
猜你喜欢
  • 2013-02-15
  • 2013-09-30
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 2021-02-15
  • 1970-01-01
相关资源
最近更新 更多