Мне нужно извлечь область пикселей, описанную (2n+1) x (2m+1) с центром на левом изображении (xl, yl). n и m являются входными параметрами пользователя, а xl и yl уже определены. Пока у меня есть этот код:
for(int xl = n; xl < picOneGreyScale.getWidth() - n; xl++) {
for(int yl = m; yl < picOneGreyScale.getHeight() - m; yl++) {
//extract (2n+1) x (2m+1) pixel region centred on leftimage (xl,yl);
for(int nArea = xl-n; nArea < xl+n+1; nArea++) {
for(int mArea = yl-m; mArea < yl+m+1; mArea++) {
*code here*
}
}
Я не уверен, как продолжить. Я определил BufferedImage с именем leftRegion:
BufferedImage leftRegion = new BufferedImage((2*n+1),(2*m+1),BufferedImage.TYPE_BYTE_GRAY);
который я собираюсь использовать для «извлечения» моей пиксельной области. До сих пор я думал о том, где написано код здесь для извлечения пикселя в текущем местоположении (используя getRGB?), а затем вложения другого цикла for, чтобы поместить этот пиксель в правильные координаты x, y для левая обл. Однако я не уверен, как это сделать, или я думаю слишком сложно. В качестве альтернативы можно использовать getRGB с расширенными аргументами:
getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize)
вместо двух внутренних циклов for, но опять же я не очень разбираюсь в том, как это реализовать. Наконец, есть метод для BufferedImage, называемый copyData, который выглядит так, как будто он может быть уместным, но я не уверен, как его использовать. Каков наилучший способ реализовать это? Большое спасибо, как всегда.
Дополнительная информация:
Итак, я пытаюсь использовать метод getSubImage класса BufferedImage:
leftRegion = picOneGreyScale.getSubimage(xl, yl, (2*n+1), (2*m+1));
только я получаю сообщение об ошибке "(y + высота) находится за пределами растра". Как именно работает getSubImage? Будет ли изображение центрировано вокруг xl, yl с одинаковой шириной и высотой в обе стороны, или оно работает по-другому? Я даже следую правильному пути?