Problema ao contar pixels com laço for. (RESOLVIDO)

4 respostas
S

Boa tarde senhores,

Estou tentando desenvolver um pequeno software de leitura de cartão resposta. Bom sou iniciante em java, por tanto se ele parecer rudimentar e logo de cara voces perceberem que há 1000 outras formas melhores de fazê-lo, é porque eu estou tentando fazer ele com o pouco conhecimento em java que eu tenho.

Enfim minha dúvida é bem simples, nesta classe, eu pego uma imagem do disco, e vou "varrendo" pixel a pixel descobrindo seu valor RGB para identificar o que é preto e o que é branco. Simples assim.

Porém no laço for do método showpixels(), ele não vai até o final do valor da variavel. Por exemplo são 2 laços for, um dentro do outro, que incrementam +1 nas variaveis altura e largura, carregando uma imagem com 800x600, o laço está parando em 599 x 599.
//...devidos imports...

public class Imagem{
public void showpixels()
 {
    try{
        File arquivo = escolherArquivos();
        BufferedImage imagem = ImageIO.read(arquivo);
        int altura = imagem.getHeight();
        int largura = imagem.getWidth();
       
        System.out.println("Altura, Largura:"+altura+","+largura);

        for (int i = 0; i < altura; i++){     // o problema está aqui 
           for (int j = 0; j < largura; j++){
               int pixel = imagem.getRGB(i, j); // eu reparei o seguinte aqui se eu comento esta linha o laço conta normalmente até o final.
               System.out.println(i+","+j);
               printpixels(pixel);  }
                                        }
    }catch(IOException e){
        e.printStackTrace();}
    }

public void printpixels(int pixel){

    int red = (pixel >> 16) & 0xff;
    int green = (pixel >> 8) & 0xff;
    int blue = (pixel) & 0xff;
    System.out.println("argb: " + red + ", " + green + ", " + blue);

}
public File escolherArquivos()throws IOException {

        File arquivos  = null;
        JFileChooser fc = new JFileChooser();
        fc.setDialogTitle("Escolha o(s) arquivo(s)...");
        fc.setDialogType(JFileChooser.OPEN_DIALOG);
        fc.setApproveButtonText("OK");
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fc.setMultiSelectionEnabled(true);
        int resultado = fc.showOpenDialog(fc);
        if (resultado == JFileChooser.CANCEL_OPTION){
          return null;}
        arquivos = fc.getSelectedFile();
          return arquivos;
    }

}

Enfim, revisei várias vezes, mas não cheguei ao porque isso está acontecendo... se puderem me ajudar, fico mto agradecido, abs!

4 Respostas

E

getRGB tem 2 parâmetros, x e y. Só que você está usando “i” e “j” e isso é que confundiu sua cabeça. Se você tivesse feito isto aqui:

for (int x = 0; x < largura; x++){     // o problema está aqui   
           for (int y = 0; y < altura; y++){  
               int pixel = imagem.getRGB(x, y); 
               System.out.println(x+","+y);  
               printpixels(pixel);  }  
                                        }

teria percebido a burrada.

S

Então kra, assim eu li mas não entendi muito bem oq voce quiz dizer, meu racionio foi : o getRGB pede 2 parametros do tipo int. Eu fui lá e coloquei 2 variáveis do tipo int. Ai q eu não entendi sua explicação, qual a diferença do i,j para o x,y (considerando todas como variáveis) ???

E

É que se você tivesse usado “x” e “y”, teria visto que x tem de percorrer os valores de 0 até a largura, não a altura, e assim por diante.

Como você usou “i” e “j”, você não conseguiu associar que '“i” tinha de percorrer os valores de 0 até a largura, não a altura.

Usando nomes mais significativos, como “x” ou “y”, é mais fácil você fazer as coisas corretas.

S

Po kra… agora eu entendi onde foi minha confuzão… vlw kra muito obrigado pela explicação…

Criado 17 de abril de 2012
Ultima resposta 17 de abr. de 2012
Respostas 4
Participantes 2