java - BufferedImage.getData().getPixels() 中的异常

标签 java exception bufferedimage

我正在寻找将缓冲图像转换为其相应的像素值数组。我找到了一个代码:

public static double[] createArrFromIm(BufferedImage im){
      int imWidth = im.getWidth();
      int imHeight = im.getHeight();
      double[] imArr = new double[imWidth* imHeight];
      im.getData().getPixels(0, 0, imWidth, imHeight, imArr);
      return imArr;
}

编写此代码块的原始作者还提供了一些非常适合此 block 的示例图像。但是,当我尝试针对图像运行此 block 时(图像始终为 125*150),该 block 会在以下行抛出数组索引越界异常:

      im.getData().getPixels(0, 0, imWidth, imHeight, imArr);

这件事对我来说似乎很神秘。任何帮助或建议都将非常感激。谢谢。

最佳答案

正如 @FiReTiTi 所说,您应该使用 getRaster() 方法而不是 getData() 方法,除非您真的想要一个图像数据的副本。

但是,这并不是异常的原因。问题是你的 double 数组只为单个 band 分配空间(类似地,FiReTiTi 的版本可以工作,因为他明确地将最后一个参数保留为 0,只请求第一个 band)。这对于单波段(灰度)图像来说很好,但我假设您使用 RGB、CMYK 或其他具有多个波段的颜色模型。

解决方法是将分配的空间乘以 band 的数量,如下所示:

public static double[] createArrFromIm(BufferedImage im) {
    int imWidth = im.getWidth();
    int imHeight = im.getHeight();
    int imBands = im.getRaster().getNumBands(); // typically 3 or 4, depending on RGB or ARGB

    double[] imArr = new double[imWidth * imHeight * imBands];
    im.getRaster().getPixels(0, 0, imWidth, imHeight, imArr);

    return imArr;
}

关于java - BufferedImage.getData().getPixels() 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37584546/

相关文章:

java - 为什么没有java.lang.UnsupportedClassVersionError?

java - 来自字符串的缓冲图像

java - 使用 java 将托管磁盘附加到 vmss 实例

java - 数字和字符串组合的格式

java - 将环境变量传递给多个配置文件的最佳方法

Java错误: 'Throw new Exception not Supported'

java - 如何在 MainActivity 类中添加抛出异常子句?

java - 查明 BufferedImage 是否被点击

java - 将 24 位图像 RGB 转换为 3 位 8 色

java - ListView 包含复选框滚动问题