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

时间:2016-06-02 06:45:26

标签: 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;
}

编写此代码块的原作者也提供了一些适用于此块的示例图像。但是,当我尝试对我的图像运行此块(图像总是125 * 150)时,块在行中抛出一个数组索引超出绑定的异常:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

修复方法是将分配的空间乘以波段数,如下所示:

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;
}

答案 1 :(得分:-1)

使用栅格:

function TodoCtrl($scope) {
  $scope.dobSubmit = function(dob){
    $scope.dateOfBirth = new Date(dob);
    $scope.presentDate = new Date();
    if(formatDateYmd($scope.presentDate) > formatDateYmd($scope.dateOfBirth)){
      alert('present date is greater than date of birth which is correct format');
    }
    else{
      alert('date of birth is greater or equal to present date which is incorrect format');
    }
  }


  var formatDateYmd = function(date) {
    var day = date.getDate();
    var monthIndex = date.getMonth() + 1;
    var year = date.getFullYear();
    console.log(''+year+ (monthIndex < 10 ? '0' + monthIndex : monthIndex) + (day < 10 ? '0' + day : day));
    return ''+year+ (monthIndex < 10 ? '0' + monthIndex : monthIndex) + (day < 10 ? '0' + day : day);

  }

}

正如@haraldK指出的那样,getData()也可以工作,但是它会返回一个栅格的副本,所以速度较慢。

使用DataBuffer有一种更快的方法,但是你必须管理BufferedImage编码,因为你可以直接访问像素值。

这就是为什么你做了什么,没有用的答案。 public static double[] createArrFromIm(BufferedImage im){ int imWidth = im.getWidth(); int imHeight = im.getHeight(); double[] imArr = new double[imWidth* imHeight]; for (int y=0, nb=0 ; y < imHeight ; y++) for (int x=0 ; x < imWidth ; x++, nb++) imArr[nb] = im.getRaster().getSampleDouble(x, y, 0) ; return imArr; } 返回一个数组,它不会填充您作为参数提供的数组。您作为参数提供的数组仅确定返回类型。因此,如果你想使用getData(它不是最好的选择),你必须这样做:

im.getData().getPixels()