首先,我想解释导致问题的情况/要求:
在我们的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中,因此我们希望尽可能保持它们的隔离.据我所知,我需要JAI ImageIO的安装到JRE或以其他方式使本机库提供,以使用它们,因此,其他应用程序可能访问到它们为好,这可能会导致副作用(至少我们不得不测试很多,以确保不是这种情况).
这就是问题的解释,这里再次出现: JAI ImageIO是否有任何纯Java替代品可以可靠地检测并可能转换CMYK图像?
提前致谢,
托马斯
我正在尝试将JPEG转换为,BufferedImage
以显示在上JPanel
。但是,javax.imageio.ImageIO.read()
对于它处理的JPEG似乎很挑剔,经常抛出IIOException
。几乎所有要命名的图像阅读器都可以正常打开相同的JPEG。
我看过Apache的Sanselan和JAI。但是Sanselan无法处理JPEG,并且JAI不适用于64位Windows平台,并且似乎没有得到维护(最新更新是2006年)。关于StackOverflow的先前答案建议 com.sun.image.codec.jpeg.JPEGCodec
,但是在Java 5中已弃用,在7中已消失。
这些是我唯一的选择吗?真的没有Java库能够将JPEG可靠地读取到BufferedImage
吗?