所以我试图在程序中保存一组图像的两个副本。我有一个对象,其中包含两个引用和一个加载图像并将它们传递给该特定类的新实例的循环。但是,在大约第25次迭代时,当类进行复制时,我会得到数组索引超出边界异常。我推断它试图复制到第二个副本中不存在的像素,或者它超出了第一个副本的范围。复制BufferedImage时数组索引错误
这里是一个重要的代码部分:
的循环:
Hashtable<String, Sheet> tempHashTable = new Hashtable<String, Sheet>();
for(int ii = 0; ii < sheetNames.size(); ii++) {
try {
File tempSheetFile = new File(Constants.TEMP_DIR, sheetNames.get(ii));
BufferedImage tempSheet = ImageIO.read(tempSheetFile);
System.out.println(sheetNames.get(ii));
tempHashTable.put(sheetNames.get(ii), new Sheet(tempSheet));
} catch (IOException ex) {
}
}
表初始化:
private BufferedImage defaultSheet;
private BufferedImage currentSheet;
public Sheet(BufferedImage defaultSheet) {
this.defaultSheet = defaultSheet;
currentSheet = new BufferedImage(defaultSheet.getWidth(), defaultSheet.getHeight(), BufferedImage.TYPE_INT_ARGB);
currentSheet.setData(defaultSheet.getData()); //Error line
}
错误:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 64
有关的最离奇的一部分这是第二个缓冲区edImage是用第一个的大小创建的,那么为什么我们会得到一个数组索引异常呢?
编辑:好了,所以我切换到BufferedImage.TYPE_INT_ARGB
和defaultSheet.getType()
错误不见了。现在的问题是,之前给出错误的相同图像现在显示在程序内部,而它们的红色和alpha通道肯定存在于源文件中。
编辑:切勿属性毛刺什么可通过编程可怕充分解释。新代码使构造函数加载图像两次,而不是复制现有实例的数据。干净多了,虽然我使用的可以在这里找到http://code.google.com/p/javapng/
'currentSheet =新的BufferedImage(defaultSheet.getWidth(),defaultSheet.getHeight (),BufferedImage.TYPE_INT_ARGB);'什么图像类型是当前('defaultSheet')图像? – 2012-07-17 03:31:07
那么,它是从循环中使用ImageIO.read()从PNG加载的,因此我假设ARGB。正如@cgull在答案中提到的,我将BufferedImage.TYPE_INT_ARGB切换为defaultSheet.getType()。但是,现在我发现我的程序只加载了某些图像的蓝色和绿色通道(是的,它们肯定有红色和alpha通道)。有任何想法吗? – 2012-07-17 04:10:52