【问题标题】:ImageIO Alternitive to read for InputStream to BufferedImageImageIO 用于从 InputStream 读取到 BufferedImage 的备选方案
【发布时间】:2014-09-09 06:02:42
【问题描述】:

我有一个用 Java 编写的 Spring MVC webapp,你也可以上传图片。这些图像需要进行处理(调整大小、裁剪等),我为此使用了 Scalr 库,这需要从 BufferedImage 中读取图像。

在 Java 中,您可以非常轻松地将 InputStream(这是图像的输入方式)转换为 BufferedImage:

final BufferedImage img = ImageIO.read(in);

但是,ImageIO 对图像格式确实很挑剔,如果图像有问题,就会抛出各种异常。用户可以将几乎任何质量的图像上传到网络应用程序,因此这是不可接受的。

所以我正在寻找替代方案。我做了一些谷歌搜索,其中一个建议是 Oracle 的 Java Advanced Imaging。唯一的问题是它似乎依赖于 Oracle Java 实现,而我没有使用它。

我可以使用其他库吗?

【问题讨论】:

  • 好奇,为什么图像质量会影响ImageIO 阅读它的能力...唯一明显的错误是格式不兼容或格式错误(缺少资源)。我想几乎任何图书馆都会遇到这些错误的问题......由于“质量差”,ImageIO 从来没有遇到过问题
  • 我可能没有正确使用“质量”这个词。我目前遇到的特殊异常是“javax.imageio.IIOException:不兼容的颜色转换”。但是图像在浏览器中显示正常。
  • 这是什么类型的图片?
  • 看看this previous answer 的一些想法...和this example

标签: java image javax.imageio


【解决方案1】:

我想说,暂时不要更改您的代码!

ImageIO 库的好处是它完全基于插件。如果它不能立即读取您需要的格式,您可以非常轻松地添加支持。

我为TwelveMonkeys ImageIO project 编写了几个插件(特别是,它包括一个支持CMYK 颜色空间的JPEGImageReader)。

由@MadProgrammer 链接的Werner Randelshofer 的CMYKJPEGImageReader 是另一个您可以尝试的插件。

正如您所提到的,JAI 也有允许您读取 CMYK JPEG 的插件(我认为),但是许多插件需要本机库和额外的安装,这在 Web 应用程序上下文中可能很麻烦。该项目也多年未更新。

我确信也有商业插件可用,但我没有研究过这些。

如果您真的想更改库,请查看 Apache Commons Imaging。它有一个非常好的 API,并且支持多种格式。图像被读入BufferedImages。不过Their JPEG support 目前还不是很成熟,所以很可能不会读取你的图片。

JMagickim4java 都使用ImageMagick,它对许多格式都有很好的支持。需要本地 IM 安装。然而,API 是基于文件的,这意味着您通常必须在处理之前将流写入临时文件。也不直接支持BufferedImages,但您可以根据需要进行转换,并且在许多情况下您可以使用内置于图像处理中的 IM 而不是 Java。

同样,可能有完整的商业库替代品,无论是在 Java 中还是基于本机代码。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2011-01-17
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多