首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ImageIO不支持图像类型- TwelveMonkeys插件修复不工作?

ImageIO不支持图像类型- TwelveMonkeys插件修复不工作?
EN

Stack Overflow用户
提问于 2018-03-14 05:34:31
回答 2查看 2.5K关注 0票数 0

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("JPEG");
while (readers.hasNext()) {
    System.out.println("reader: " + readers.next());
}

其中产出:

代码语言:javascript
复制
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导致了这个问题,这个问题是项目使用的一个库。我设置了一个barebone测试应用程序,该应用程序将CMYK转换为BufferedImage,然后调用ImageIO.read(img),它可以正常工作。我很难理解为什么iText在同一个项目和类路径中调用ImageIO.read(img)时不会找到TwelveMonkeys插件,但这可能是因为我的知识有限。我还应该补充一点,我正在处理的应用程序是web服务API的一部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-16 14:20:59

通常情况是,当ImageIO插件在web应用程序的运行时没有使用时,原因是由于ImageIO已经初始化,并且在web应用程序的库对JVM可用之前调用了scanForPlugins(),所以找不到服务提供者。

来自在web应用程序中部署[ImageIO]插件

因为ImageIO插件注册中心( IIORegistry)是"VM“,所以默认情况下,它不能很好地处理servlet上下文。如果您从WEB-INF/libclasses文件夹加载插件,这一点尤其明显。除非在代码中添加ImageIO.scanForPlugins(),否则插件可能根本就不可用。 此外,servlet上下文动态加载和卸载类(每个上下文使用一个新的类加载器)。如果重新启动应用程序,旧类在默认情况下将永远保留在内存中(因为下次调用scanForPlugins时,它是另一个扫描/加载类的ClassLoader,因此它们将是注册表中的新实例)。如果尝试使用剩余的“旧”读取器之一进行读取,则可能会出现奇怪的异常(如访问静态最终初始化字段时的NullPointerExceptions或未初始化的内部类的NoClassDefFoundErrors )。 为了解决发现问题和资源泄漏问题,强烈建议使用IIOProviderContextListener为web应用程序实现ImageIO插件的动态加载和卸载。

IIOProviderContextListener包含在twelvemonkeys-servlet.jar中,必须在应用程序的web.xml中注册(如果使用Spring或其他框架,则类似)。有关详细信息,请参阅上述链接。

使用上下文侦听器的另一个安全选择是将JAR文件放置在应用程序服务器的共享或公共lib文件夹中,而不是将WEB-INF/lib文件夹放在web应用程序中。

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

票数 3
EN

Stack Overflow用户

发布于 2021-04-26 07:21:48

对于没有web.xml的Spring应用程序,需要在您的@SpringBootApplication类中注册IIOProviderContextListener,该类应该扩展SpringBootServletInitializer

代码语言:javascript
复制
@Override
    public void onStartup(final ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        // Register the listener from Twelvemonkeys to support CMYK image handling with ImageIO
        servletContext.addListener(IIOProviderContextListener.class);
    }

还请参阅本期,其中将对此进行更详细的解释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49270343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档