4

We have a photo gallery that is using servlets to resize images - we need good performance and decent quality, but we just can't get it right. Also, sadly enough, we have only java 1.4, which leaves us to almost no external image libraries (nearly everything i found is java 1.5+) and java image handling is really not good.

If I use this:

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

the results are almost same every time (and bad looking) or extremely slow, it depends on the selected hint. I read almost every article about image resizing in java (including this one and it does not help.

Do you have any ideas? Any external libraries for java 1.4 that are fast and have decent quality? Any algorithm that would get good results?

4

2 回答 2

2

您可以尝试 JMagick 之类的 Image Magick 包装

于 2011-08-04T12:52:02.950 回答
0

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

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

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

但是,如果在此之前您发现 Java 扩展性能不可接受,那么该实现将无济于事。您需要考虑使用 ImageMagick 之类的本机库。

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

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

有一些建议可以帮助您到达需要去的地方,希望它们对您有所帮助。

于 2011-08-04T15:28:38.917 回答