首先,我想解释一下导致这个问题的情况/要求:
在我们的Web应用程序中,由于IE 8及更低版本无法显示它们,因此我们不支持CMYK图像(JPEG)。因此,我们需要检测何时有人要上传此类图像并拒绝它。
不幸的是,Java的ImageIO无法读取这些图像,或者使我无法获得检测到的色彩空间。通过调试,似乎在JPEGImageReader内部获得了颜色空间代码11(这意味着JCS_YCCK),但是我无法安全地访问该信息。
当向阅读器查询图像类型时,我没有得到CMYK的信息,因此我可能会假设no image types = unsupported image。
我使用成像工具将源CMYK图像转换为RGB,以便测试它是否可读(我在收到“不支持CMYK”消息时尝试模拟管理员的步骤)。但是,JPEGImageReader将不会读取该图像,因为它
假定
(在源中有注释!)3分量RGB颜色空间,但是图像标头报告了4个分量(可能是RGBA或ARGB),因此IllegalArgumentException抛出。
因此,ImageIO不是一个选择,因为我无法可靠地获取图像的色彩空间,而且我也无法告诉管理员为什么由于某些内部原因而无法接受原本不错的图像(可以由浏览器显示)错误。
这使我尝试使用JAI ImageIO,CLibJPEGImageReader它的性能出色并且可以正确读取我所有的测试图像。
但是,由于我们将应用程序部署在可能还托管其他应用程序的JBoss中,因此我们希望将它们保持尽可能的隔离。AFAIK,我需要将JAI
ImageIO安装到JRE或以其他方式提供本机库才能使用它们,因此其他应用程序也可能会访问它们,这可能会引起副作用(至少我们会进行大量测试以确保不是这种情况)。
这就是问题的解释,这里又来了: JAI ImageIO是否有任何纯Java替代品,可以可靠地检测并可能转换CMYK图像?
提前致谢,
汤玛士