我编写了一个程序来分离图像的红蓝和绿分量,但下面的代码给出了一个错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:318)
at java.awt.image.BufferedImage.getRGB(BufferedImage.java:888)
at rgb.Rgb.main(Rgb.java:46):
这是源代码:
public static void main(String[] args) {
String type = "jpg";
BufferedImage img = null;
try {
img = ImageIO.read(new File("d:\\a.jpg"));
System.out.println(img.getWidth() + " " + img.getHeight());
} catch (IOException ex) {
Logger.getLogger(Rgb.class.getName()).log(Level.SEVERE, null, ex);
}
BufferedImage rp, gp, bp;
rp = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
bp = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
gp = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
for (int i = 1; i <= img.getHeight(); i++) {
for (int j = 1; j <= img.getWidth(); j++) {
int pixel = img.getRGB(i, j);
int alpha = pixel & 0xff000000;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
rp.setRGB(i, j, alpha | (red << 16));
gp.setRGB(i, j, alpha | (green << 8));
bp.setRGB(i, j, alpha | blue);
}
}
try {
ImageIO.write(rp, type, new File("d:\\red.jpg"));
ImageIO.write(gp, type, new File("d:\\green.jpg"));
ImageIO.write(bp, type, new File("d:\\blue.jpg"));
} catch (IOException ex) {
Logger.getLogger(Rgb.class.getName()).log(Level.SEVERE, null, ex);
}
最佳答案
该方法是 getRGB(x,y)
,这意味着您的外循环应该针对宽度,而内循环应该针对高度。改为
for (int i = 0; i < img.getWidth(); i++) {
for (int j = 0; j < img.getHeight(); j++) {
原因
您正在尝试获取不存在的坐标。这是因为
- 你的循环应该从 0 开始到 getWidth()-1/getHeight()-1 结束,因为最后一个坐标是 (WIDTH-1,HEIGHT-1)
- 您的外循环正在获取 y 值,而内循环正在获取 x 值,因此您试图获取一个 (y,x) 值,而它应该是 (x,y) 值。如果它是方形图片,这不会导致任何问题,但如果它是矩形,则会导致异常,就像您的情况一样。
所以按照我在代码中的建议进行更改,它应该可以工作。
关于java - 坐标越界 :bufferedimage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25610291/