java 1.4优质图像调整大小

时间:2011-08-04 12:46:47

标签: java image-processing java1.4

我们有一个使用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的外部库都快速且质量上乘?任何可以获得良好结果的算法?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

Izk,根据您的要求,我会同意Thomas和您(可能)需要依赖外部/本地库。

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

去看看Scalr class,滚动到非常底部,然后复制最后两个方法。如果你想用Java实现它,那就是你需要完成所有95%的工作。

但是,如果您发现Java扩展性能在此之前是不可接受的,那么该实现将无法帮助您。您需要查看使用ImageMagick等本机库。

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

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

有一些建议可以让你到达目的地,我希望他们帮助你。