Java ImageIO不支持的图像类型-十二猴子插件,修复程序不起作用?

Java ImageIO不支持的图像类型-十二猴子插件,修复程序不起作用?,java,compression,javax.imageio,twelvemonkeys,Java,Compression,Javax.imageio,Twelvemonkeys,由于使用com.sun.imageio.plugins.jpeg.JPEGImageReader的颜色配置文件不兼容,我遇到了不受支持的图像类型错误。后来我找到了TwelveMonkeys插件,它们被证明可以解决这个问题,并在我的项目类路径中引用了dependent.jar。我从Twelvemkeys github存储库下载了它们。注意,我使用的是版本3.0.2,因为我运行的是带有JDK1.6.0_45的Java6。以下是我添加到项目中的.jar: common-lang-3.0.2.jar c

由于使用
com.sun.imageio.plugins.jpeg.JPEGImageReader
的颜色配置文件不兼容,我遇到了不受支持的图像类型错误。后来我找到了TwelveMonkeys插件,它们被证明可以解决这个问题,并在我的项目类路径中引用了dependent.jar。我从Twelvemkeys github存储库下载了它们。注意,我使用的是版本3.0.2,因为我运行的是带有JDK1.6.0_45的Java6。以下是我添加到项目中的.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());
}
当我运行代码时,它仍在尝试使用
com.sun.imageio.plugins.JPEG.JPEGImageReader
读取JPEG,并继续抛出IIOException。有什么想法吗

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

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

发件人:

由于ImageIO插件注册表(iOreRegistry
iOreRegistry
)是“VM全局”的,因此默认情况下,它不能很好地处理servlet上下文。如果从
WEB-INF/lib
classes
文件夹加载插件,这一点尤为明显。除非在代码中的某个地方添加
ImageIO.scanForPlugins()
,否则这些插件可能永远都不可用

此外,servlet上下文动态加载和卸载类(每个上下文使用一个新的类加载器)。如果重新启动应用程序,默认情况下,旧类将永远保留在内存中(因为下次调用
scanForPlugins
时,是另一个
ClassLoader
扫描/加载类,因此它们将成为注册表中的新实例)。如果尝试使用剩余的“旧”读卡器之一进行读取,则可能会出现奇怪的异常(如访问静态最终初始化字段时出现的
NullPointerExceptions
,或未初始化内部类出现的
NoClassDefFoundErrors

为了解决发现问题和资源泄漏问题,强烈建议使用
IIOProviderContextListener
,它为web应用程序实现ImageIO插件的动态加载和卸载

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

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


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

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

发件人:

由于ImageIO插件注册表(iOreRegistry
iOreRegistry
)是“VM全局”的,因此默认情况下,它不能很好地处理servlet上下文。如果从
WEB-INF/lib
classes
文件夹加载插件,这一点尤为明显。除非在代码中的某个地方添加
ImageIO.scanForPlugins()
,否则这些插件可能永远都不可用

此外,servlet上下文动态加载和卸载类(每个上下文使用一个新的类加载器)。如果重新启动应用程序,默认情况下,旧类将永远保留在内存中(因为下次调用
scanForPlugins
时,是另一个
ClassLoader
扫描/加载类,因此它们将成为注册表中的新实例)。如果尝试使用剩余的“旧”读卡器之一进行读取,则可能会出现奇怪的异常(如访问静态最终初始化字段时出现的
NullPointerExceptions
,或未初始化内部类出现的
NoClassDefFoundErrors

为了解决发现问题和资源泄漏问题,强烈建议使用
IIOProviderContextListener
,它为web应用程序实现ImageIO插件的动态加载和卸载

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

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

PS:上述问题/解决方案通常适用于ImageIO插件,而不仅仅是TwelveMonkeys插件。因此,上下文侦听器与TwelveMonkeys ImageIO插件没有依赖关系,可以与J一起使用
reader: com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageReader@4102799c
reader: com.sun.imageio.plugins.jpeg.JPEGImageReader@33d6f122
@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);
    }