Я сделал программу для выделения красных синих и зеленых компонентов изображения, но приведенный ниже код дает ошибку:
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++) {
ПРИЧИНА
Вы пытаетесь получить координату, которой не существует. Это потому что
Поэтому внесите изменения, как я предложил в коде, и он должен работать.
Вы получаете исключение ArrayIndexOutOfBoundsException, потому что ваши циклы отключены на единицу. Индексы пикселей начинаются с 0 (не 1) и выполняются до getWidth() -1 и getHeight() -1.
Вторая проблема заключается в том, что вы меняете аргументы при вызове getRGB(). Подпись getRGB - getRGB (int x, int y), но вы вызываете getRGB (y, x).
Вы правильно просматриваете изображение (внешняя петля итерации по строкам, внутренний цикл по столбцам). Не заменяйте циклы, как это было предложено другими ответами, но поменяйте порядок аргументов, предоставляемых getRGB.
Вот скорректированный код, с я и j, переименованный в строку и col, чтобы помочь уточнить:
for (int row = 0; row < img.getHeight(); row++)
{
for (int col = 0; col < img.getWidth(); col++)
{
int pixel = img.getRGB(col, row); // getRGB(x,y)
int alpha = pixel & 0xff000000;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
rp.setRGB(col, row, alpha | (red << 16));
gp.setRGB(col, row, alpha | (green << 8));
bp.setRGB(col, row, alpha | blue);
}
}