首先,我想解释导致问题的情况/要求:
在我们的 Web 应用程序中,我们不支持 CMYK 图像 (JPEG),因为 IE 8 及更低版本无法显示它们。因此,我们需要检测何时有人想要上传这样的图像并拒绝它。
不幸的是,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 中,该 JBoss 也可能托管其他应用程序,因此我们希望使它们尽可能地隔离。AFAIK,我需要将 JAI ImageIO 安装到 JRE 或以其他方式使本机库可用才能使用它们,因此其他应用程序也可能访问它们,这可能会导致副作用(至少我们会有进行大量测试以确保不是这种情况)。
这就是问题的解释,这里又来了: 是否有任何纯 Java 替代 JAI ImageIO 可以可靠地检测并可能转换 CMYK 图像?
提前致谢,
托马斯