我正在寻找将缓冲图像转换为其相应的像素值数组。我找到了一个代码:
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/