我写了一个读取图像的方法。我循环遍历图像文件列表并读取它们。在一些迭代之后,当调用Raster.setRect(栅格)方法时出现ArrayIndexOutOfBoundsException。图像的尺寸和边界都很好-请参阅stacktrace。
public static BufferedImage readImage(File imageFile) {
// Find a suitable ImageReader
Iterator<ImageReader> readers = ImageIO.getImageReadersBySuffix("jpg");
ImageReader reader = null;
while (readers.hasNext()) {
reader = (ImageReader) readers.next();
if (reader.canReadRaster()) {
break;
}
}
// Stream the image file (the original CMYK image)
ImageInputStream input = null;
try {
input = ImageIO.createImageInputStream(imageFile);
} catch (IOException e) {
logger.error("Error creating InputStream on File {}", imageFile
.getName());
e.printStackTrace();
}
reader.setInput(input);
// Read the image raster
Raster raster = null;
try {
raster = reader.readRaster(0, null);
} catch (IOException e) {
logger
.error("Error reading Raster of file {}", imageFile
.getName());
e.printStackTrace();
}
// Create a new RGB image
BufferedImage bi = new BufferedImage(raster.getWidth(), raster
.getHeight(), BufferedImage.TYPE_INT_RGB);
// Fill the new image with the old raster
logger.debug("Height {} and width {} of original raster", raster
.getHeight(), raster.getWidth());
logger.debug("Height {} and width {} of new raster", bi.getRaster()
.getHeight(), bi.getRaster().getWidth());
logger.debug("NumBands original raster {}", bi.getRaster().getBounds());
logger.debug("NumBands new raster {}", bi.getRaster().getBounds());
bi.getRaster().setRect(raster);
// Close and flush the reader
try {
input.close();
} catch (IOException e) {
logger.error("Error closing the reader for file {}", imageFile
.getName());
e.printStackTrace();
}
return bi;
}下面是堆栈跟踪:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 310
at java.awt.image.SinglePixelPackedSampleModel.setPixels(SinglePixelPackedSampleModel.java:689)
at java.awt.image.WritableRaster.setPixels(WritableRaster.java:565)
at java.awt.image.WritableRaster.setRect(WritableRaster.java:467)
at java.awt.image.WritableRaster.setRect(WritableRaster.java:403)
at .. .utils.ImageUtils.readImage(ImageUtils.java:228)
at .. .image.scripts.ImageMatchingScript.main(ImageMatchingScript.java:86)所有图像都具有相同的尺寸371x310
下面是我打印的调试信息:
13:53:17.065 [main] DEBUG .. .ImageUtils - Height 371 and width 310 of original raster
13:53:17.065 [main] DEBUG .. .ImageUtils - Height 371 and width 310 of new raster
13:53:17.065 [main] DEBUG .. .ImageUtils - NumBands original raster java.awt.Rectangle[x=0,y=0,width=310,height=371]
13:53:17.065 [main] DEBUG .. .ImageUtils - NumBands new raster java.awt.Rectangle[x=0,y=0,width=310,height=371]文档说: ArrayIndexOutOfBoundsException -如果坐标不在边界内,或者如果fArray太小而无法容纳输入。
对我来说,尺寸/边界似乎很好,也许这是fArray的问题?
发布于 2012-03-07 21:50:07
我想问题不在于图像的尺寸,而在于光栅中的波段数。您可以创建自己的BufferedImage.TYPE_INT_RGB。可能失败的图像是带有alpha通道的PNG,在这种情况下,光栅有一个额外的波段。
我想知道为什么您要以这种复杂的方式进行加载,为什么不直接使用ImageIo.read(InputStream)呢?这将给你一个BufferedImage,不需要自己转换它。
编辑:尝试此方法读取并转换为RGB:
InputStream input = null;
try {
input = new FileInputStream(...); // whatever your source is
BufferedImage rawImage = ImageIO.read(input);
if (rawImage == null)
return null;
BufferedImage rgbImage = new BufferedImage(rawImage.getWidth(null), rawImage.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics g = rgbImage.createGraphics();
// if rawImage contains alpha, consider filling the rgbImage with a default BG color here
g.drawImage(rawImage, 0, 0, null);
g.dispose();
rawImage.flush();
return rgbImage;
} catch (Exception e) {
// handle error
return null;
} finally {
// close input if open
if (input != null) {
try {
input.close();
} catch (IOException e) {}
}
}只是把代码拼凑在一起,可能包含打字错误。这样你就可以得到RGB图像,而不管源文件是什么,甚至无需考虑源图像属性。
https://stackoverflow.com/questions/9602303
复制相似问题