Problema ao ler imagem JPG

Olá,

Estou fazendo um trabalho de processamento de imagens digitais e me deparei com um erro durante a execução do prorama que me deixou com a cabeça quente.

Meu objetivo nessa parte do trabalho é simplesmente ler uma foto JPG, e fazer comparações entre os valores RGB de cada pixel.


import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public static void main(String[] args) throws IOException  {

        BufferedImage foto = ImageIO.read(new File("imagem.jpg"));

        for(int x = 0; x < foto.getHeight(); x++)
             for(int y = 0; y < foto.getWidth(); y++) {

               Color cor = new Color(foto.getRGB(x,y)); 
                
               //Restante dos cálculos...

            }//fim do for
    }

Ao instânciar um objeto Color (linha 15) para receber a informação de cada pixel durante 2 laços de repetição(linhas e colunas) o erro em tempo de execução seguinte aparece:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
        at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:302)
        at java.awt.image.BufferedImage.getRGB(BufferedImage.java:881)

Pensei na hora:“Ok. Eu apenas errei em algum número referente ao tamanho da imagem durante os laços.”
Não há nada de errado!

Testei uma série de cálculos do mesmo tipo e toda vez que uso algo que utiliza os métodos getDataElements ou setDataElements, originados da classe Raster, ao ler uma JPG encontro este erro.

Alguém poderia me ajudar?

Você está percorrendo a altura com X e a largura com Y:

for(int x = 0; x < foto.getHeight(); x++)
for(int y = 0; y < foto.getWidth(); y++)

Invertendo para largura com X e altura com Y deve funcionar.

[quote=roger_rf]Você está percorrendo a altura com X e a largura com Y:

for(int x = 0; x < foto.getHeight(); x++)
for(int y = 0; y < foto.getWidth(); y++)

Invertendo para largura com X e altura com Y deve funcionar.[/quote]

Fora isso, é recomendável você pôr a altura e a largura em uma variável separada.
Não sei se getHeight() ou getWidth() são operações lentas (podem até ser; depende um pouco da implementação da subclasse de BufferedImage que foi retornada por ImageIO.read) , mas como elas serão executadas milhões de vezes (ou seja, a cada iteração do loop), é melhor você pôr tais resultados em variáveis separadas, até porque elas não vão ser alteradas durante a execução.
Algo que costumo fazer é isto aqui:

for(int x = 0, altura = foto.getHeight(); x < altura; x++)
for(int y = 0, largura = foto.getWidth(); y < largura; y++)

(Você sabia que é possível definir mais que uma variável no for? O único problema é que ambas devem ter o mesmo tipo.)

O problema foi resolvido galera.

Obrigado