我希望将缓冲图像转换为相应的像素值数组。我找到了一个代码:
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);
这件事对我来说似乎很神秘。任何帮助或建议都会非常明显。感谢。
答案 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()