无法使用 ImageIO.read(文件文件)读取 JPEG 图像
我在使用ImageIO.read(File file)读取此JPEG文件时遇到问题 - 它引发异常,并显示消息“不支持的图像类型”。
我尝试过其他JPEG图像,它们似乎工作正常。
我能够发现的唯一区别是此文件似乎包含缩略图 - 这是否已知会导致ImageIO.read()出现问题?
编辑:
添加了生成的图像:
我在使用ImageIO.read(File file)读取此JPEG文件时遇到问题 - 它引发异常,并显示消息“不支持的图像类型”。
我尝试过其他JPEG图像,它们似乎工作正常。
我能够发现的唯一区别是此文件似乎包含缩略图 - 这是否已知会导致ImageIO.read()出现问题?
编辑:
添加了生成的图像:
旧帖子,但供将来参考:
受到这个问题和在这里找到的链接的启发,我为ImageIO编写了一个JPEGImageReader插件,该插件支持CMYK颜色模型(既可以使用原始颜色模型,也可以在读取时隐式转换为RGB)。与此处提到的其他解决方案相比,阅读器还使用嵌入在JPEG流中的ICC配置文件进行适当的颜色转换。
它是普通的Java,不需要JAI。源代码和二进制发行版在 github.com/haraldk/TwelveMonkeys 免费提供,并由BSD风格的许可证覆盖。
安装完成后,它允许您使用如下方式读取CMYK JPEG:ImageIO.read(...)
File cmykJPEGFile = new File(/*path*/);
BufferedImage image = ImageIO.read(cmykJPEGFile);
即:在大多数情况下,没有必要修改代码。
您的图像“颜色模型”是 CMYK,(读取文件的内部类)仅读取 RGB 颜色模型。JPEGImageReader
如果您坚持阅读CMYK图像,那么您将需要转换它们,请尝试此代码。
更新
将 CMYK 图像读取到 RGB BufferedImage 中。
File f = new File("/path/imagefile.jpg");
//Find a suitable ImageReader
Iterator readers = ImageIO.getImageReadersByFormatName("JPEG");
ImageReader reader = null;
while(readers.hasNext()) {
reader = (ImageReader)readers.next();
if(reader.canReadRaster()) {
break;
}
}
//Stream the image file (the original CMYK image)
ImageInputStream input = ImageIO.createImageInputStream(f);
reader.setInput(input);
//Read the image raster
Raster raster = reader.readRaster(0, null);
//Create a new RGB image
BufferedImage bi = new BufferedImage(raster.getWidth(), raster.getHeight(),
BufferedImage.TYPE_4BYTE_ABGR);
//Fill the new image with the old raster
bi.getRaster().setRect(raster);
更新 - 2015 年 3 月 - 添加模拟图像
原始图像已从OP的Dropbox中删除。因此,我正在添加新图像(而不是原始图像),以模拟它们所发生的问题。
第一个图像是普通 RGB 图像的外观。
第二个图像是相同图像在CMYK颜色模型中的外观。
您实际上无法看到它在网络上的外观,因为它将被主机转换为RGB。要确切地看到它的外观,请获取RGB图像并通过RGB到CMYK转换器运行它。
第三个图像是 CMYK 图像在使用 Java ImageIO 读取然后编写时的外观。
OP发生的问题是他们有类似图像2的东西,当你尝试阅读它时会引发异常。