ImageIO.read非法参数异常 - 栅格波段/颜色空间组件? [英] ImageIO.read illegal argument exception - raster bands/colour space components?
问题描述
对于有点模糊的标题道歉,我无法弄清楚关键字在这里是什么。设置非常简单,我打开图像
Apologies for the somewhat vague title, I can't work out what the keywords are here. The setup's quite simple, I'm opening an image with
ImageIO.read(new File(filename));
这适用于大多数文件,但对于一个我得到 IllegalArgumentException with detail:源Raster band和源颜色空间组件的数量不匹配
。这个图像是通过wget在有效的Flickr URL上获得的,我使用了这种方式获得的其他图像,因此获取图像的方法原则上看起来很合理。我不确定导致异常的是什么。
This works for most files, however for one I get an IllegalArgumentException with the detail: "numbers of source Raster bands and source color space components do not match"
. This image was obtained via wget on a valid Flickr URL, and I've used other images obtained this way, so the method for obtaining images seems sound in principle. I'm not sure what's causing the exception.
解决方法可以接受 - 我不喜欢使用 ImageIO $特别是c $ c>,图像看起来很好看。我只需要让它在没有Java吓到的情况下被阅读!
A workaround would be more than acceptable - I'm not fussed with using ImageIO
in particular, and the image looks fine visually. I just need to get it being read without Java freaking out!
这是有问题的图像,万一它有用:
Here's the image in question, in case it's of any use:
推荐答案
所以我遇到了同样的问题,发现图像是灰度级的,而且默认的ImageIO.read实现并没有弄清楚,因为图像元数据并不像预期的那样。我写了一个解决方案,如果主加载失败,重试加载为'BufferedImage.TYPE_BYTE_GRAY'。
So I was having this same issue and found that the image was gray-scale and that the default ImageIO.read implementation was not figuring that out because the image metadata wasn't quite as expected. I wrote a work around that retries the load as 'BufferedImage.TYPE_BYTE_GRAY' if it fails the main load.
Iterator<ImageReader> iter = ImageIO.getImageReaders(stream);
Exception lastException = null;
while (iter.hasNext()) {
ImageReader reader = null;
try {
reader = (ImageReader)iter.next();
ImageReadParam param = reader.getDefaultReadParam();
reader.setInput(stream, true, true);
Iterator<ImageTypeSpecifier> imageTypes = reader.getImageTypes(0);
while (imageTypes.hasNext()) {
ImageTypeSpecifier imageTypeSpecifier = imageTypes.next();
int bufferedImageType = imageTypeSpecifier.getBufferedImageType();
if (bufferedImageType == BufferedImage.TYPE_BYTE_GRAY) {
param.setDestinationType(imageTypeSpecifier);
break;
}
}
bufferedImage = reader.read(0, param);
if (null != bufferedImage) break;
} catch (Exception e) {
lastException = e;
} finally {
if (null != reader) reader.dispose();
}
}
// If you don't have an image at the end of all readers
if (null == bufferedImage) {
if (null != lastException) {
throw lastException;
}
}
这篇关于ImageIO.read非法参数异常 - 栅格波段/颜色空间组件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!