【问题标题】:Array index error when duplicating a BufferedImage复制 BufferedImage 时出现数组索引错误
【发布时间】:2012-07-17 13:56:44
【问题描述】:

所以我试图在我的程序中缓存一组图像的两个副本。我有一个包含两个引用的对象和一个加载图像并将它们传递给该特定类的新实例的循环。但是,大约在第 25 次迭代时,当类进行复制时,我得到了一个数组索引越界异常。我推断它要么尝试复制到第二个副本中不存在的像素,要么超出了第一个副本的范围。

以下是重要的代码部分:

循环:

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

关于它最奇怪的部分是第二个 BufferedImage 是用第一个的大小创建的,那么为什么我们会得到一个数组索引异常呢?

编辑:好的,所以我将BufferedImage.TYPE_INT_ARGB 切换到defaultSheet.getType() 并且错误消失了。现在的问题是,之前给我错误的相同图像现在显示在程序中,而没有源文件中肯定存在的红色和 alpha 通道。

编辑:永远不要将可以通过糟糕的编程充分解释的故障归咎于故障。新代码让构造函数加载图像两次,而不是复制现有实例的数据。更干净,虽然我使用的是javapng 库,这里有http://code.google.com/p/javapng/

【问题讨论】:

  • currentSheet = new BufferedImage(defaultSheet.getWidth(), defaultSheet.getHeight(), BufferedImage.TYPE_INT_ARGB); 当前 (defaultSheet) 图片是什么图片类型?
  • 好吧,它是在循环中使用 ImageIO.read() 从 PNG 加载的,所以我假设为 ARGB。正如@cgull 在答案中提到的,我将 BufferedImage.TYPE_INT_ARGB 切换为 defaultSheet.getType()。但是,现在我发现我的程序只加载了一些图像的蓝色和绿色通道(是的,它们肯定有红色和 alpha 通道)。有什么想法吗?

标签: java arrays image


【解决方案1】:

尝试在 Sheet 构造函数中将行更改为以下内容:

currentSheet = new BufferedImage(defaultSheet.getWidth(), defaultSheet.getHeight(), defaultSheet.getType());

【讨论】:

  • 非常感谢@cgull,这就像一个魅力。这很有趣;你会知道为什么 png 不会生成 ARGB 图像类型吗?
  • 有问题的 png 是否可能没有 alpha 通道?
  • 好吧,看看它从那里读取的实际文件肯定有一个 Alpha 通道。但是,一旦将图像加载到我的程序中查看图像,就会发现一个明确的问题:一些图像(至少其中一个是我之前遇到问题的那个)似乎缺少它们的 alpha 通道和红色通道。很奇怪……
  • 它可能指向ImageIO 中的一个错误,即无法正确加载某些png;正如此错误报告所示,这并非闻所未闻:bugs.sun.com/view_bug.do?bug_id=6703368
  • 嗯。您是否偶然知道 Java 的替代图像加载库?该链接上列出的解决方法......是的,有点不言自明。
猜你喜欢
  • 2017-02-19
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2021-06-14
  • 2019-06-17
  • 1970-01-01
相关资源
最近更新 更多