gpt4 book ai didi

java - ImageIO 不支持的图像类型 - 修复后的 TwelveMonkeys 插件无法正常工作?

转载 作者:行者123 更新时间:2023-12-02 02:16:21 25 4
gpt4 key购买 nike

由于使用 com.sun.imageio.plugins.jpeg.JPEGImageReader 的颜色配置文件不兼容,我遇到了“不支持的图像类型”错误。后来我发现 TwelveMonkeys 插件被证明可以解决这个问题,并在我的项目类路径中引用了依赖的 .jar。我从 TwelveMonkeys github 存储库下载了它们。请注意,我使用的是 3.0.2 版本,因为我在带有 JDK 1.6.0_45 的 Java 6 上运行。这些是我添加到项目中的 .jar:

common-lang-3.0.2.jar
common-io-3.0.2.jar
common-image-3.0.2.jar
imageio-core-3.0.2.jar
imageio-metadata-3.0.2.jar
imageio-jpeg-3.0.2.jar

我能够使用以下测试来测试库的安装和工作:

Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("JPEG");
while (readers.hasNext()) {
System.out.println("reader: " + readers.next());
}

哪些输出:

reader: com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageReader@4102799c
reader: com.sun.imageio.plugins.jpeg.JPEGImageReader@33d6f122

当我运行代码时,它仍然尝试使用 com.sun.imageio.plugins.jpeg.JPEGImageReader 读取 JPEG,并继续抛出 IIOException。有什么想法吗?

更新:它看起来像 iTextPDF 导致了该项目使用的库的问题。我设置了一个准系统测试应用程序,将 CMYK JPEG 转换为 BufferedImage,然后调用 ImageIO.read(img),它工作正常。我很难理解为什么 iText 在同一项目和类路径中调用 ImageIO.read(img) 时找不到 TwelveMonkeys 插件的原因,但这可能是由于我有限的知识。我还应该补充一点,我正在开发的应用程序是 Web 服务 API 的一部分。

最佳答案

通常情况下,当 Web 应用程序在运行时未使用 ImageIO 插件时,原因是找不到服务提供者,因为 ImageIO 已初始化,并在 Web 应用程序的库可用于 JVM 之前调用 scanForPlugins()

来自Deploying [ImageIO] plugins in a web app :

Because the ImageIO plugin registry (the IIORegistry) is "VM global", it doesn't by default work well with servlet contexts. This is especially evident if you load plugins from the WEB-INF/lib or classes folder. Unless you add ImageIO.scanForPlugins() somewhere in your code, the plugins might never be available at all.

In addition, servlet contexts dynamically loads and unloads classes (using a new class loader per context). If you restart your application, old classes will by default remain in memory forever (because the next time scanForPlugins is called, it's another ClassLoader that scans/loads classes, and thus they will be new instances in the registry). If a read is attempted using one of the remaining "old" readers, weird exceptions (like NullPointerExceptions when accessing static final initialized fields or NoClassDefFoundErrors for uninitialized inner classes) may occur.

To work around both the discovery problem and the resource leak, it is strongly recommended to use the IIOProviderContextListener that implements dynamic loading and unloading of ImageIO plugins for web applications.

IIOProviderContextListener 包含在 twelvemonkeys-servlet.jar 中,并且必须在应用程序的 web.xml 中注册(或者类似的情况,如果使用 Spring 或其他框架)。详情请参阅上面的链接。

使用上下文监听器的另一个安全替代方法是将 JAR 文件放置在应用程序服务器的共享或公共(public) lib 文件夹中,而不是放置在 Web 应用程序内的 WEB-INF/lib 文件夹中。

PS:上述问题/解决方案通常适用于 ImageIO 插件,而不仅仅是 TwelveMonkeys 插件。因此,上下文监听器不依赖于 TwelveMonkeys ImageIO 插件,并且也可以与 JAI ImageIO 或其他 ImageIO 插件一起使用。

关于java - ImageIO 不支持的图像类型 - 修复后的 TwelveMonkeys 插件无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49270343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com