Figuras em PGM

Oi pessoal.
Estou fazendo um trabalho da faculdade em Java, onde preciso ler uma figura no formato PGM. Até aí tudo bem, consigo ler ela.
Porém, minha matriz de pixels fica totalmente desregulada - os caracteres são símbolos estranhos, em vez de números. Eu estava lendo a imagem e usando um read() para pegar o símbolo atual. Só que, para passar para a matriz de pixels eu usava cast para char. Será que pode ser isso? Eu tentei abrir com o bloco de notas, mas os símbolos ficam quadrados. Eu acredito que seja algum problema com a imagem mesmo e não com o leitor.
O que vocês acham? (Estou postando a imagem em anexo). Eu tentei mudar para pegar a linha como String, porém tive o mesmo resultado.
O código da inserção na matriz está assim:

for (int i = 0; i < altura; i++) {
                for (int j = 0; j < largura; j++) {
                    pixels[i][j] = (char)leitor.read();
                }
            }

Aliás, alguém sabe onde posso encontrar uma base de faces em escala de cinza e com resolução pequena? A maioria das bases tem resolução muito alta, mas acho complicado treinar uma rede neural assim. A base de faces que estou usando é a CBCL, do MIT.
Alguém conhece outra que seja grayscale e seja imagens de frente (ou um pouco de lado?).

Não conheço o formato PGM, mas é muito estranho fazer-se cast para char ao trabalhar-se com imagens. Pior ainda com Strings.

E se ele é uma imagem, não faz sentido abrir no bloco de notas, o conteúdo não são caracteres, e sim apenas um amontoado de zeros e uns agrupados de 8 em 8. Portanto, seja lá o que for que apareça no bloco de notas, não vai ter o menor sentido.

Outra coisa, a menos que seja um formato baseado em bitmap (não conheço o PGM, portanto não sei), o que você lerá do arquivo não serão pixels. Serão apenas um monte de zero e uns que você vai ter que passar para um método que seja capaz de decodificá-los para então obter os pixels.

Victor,
Para uma imagem com extensão “conhecida” é assim que funciona mesmo. Mas o PGM é um outro tipo. Por exemplo, uma imagem em PGM não é composta por um amontoado de números, mas existe informações antes dela.
Por exemplo, uma imagem com 3 pixels por 3 pixels, com 10 níveis de cinza.

O que aparece mesmo é o que vem depois do “10”. Ainda podem ser colocados comentários dentro da imagem, usando “#”.
Um link legal sobre isso é http://local.wasp.uwa.edu.au/~pbourke/dataformats/ppm/ .

Sobre o cast, vou dar uma pesquisada. Se não me engano o leitor.read() retorna um int, então deveria ser possível fazer isso (eu não lembro em Java, mas em C++ ele converte).

Abraço.

Bem, ele é um formato bitmap e aparentemente sem nenhuma forma de compressão, com 1 byte = 1 pixel. Então você não precisa de conversor nenhum mesmo.

Se bem que, pensando bem, se você der um System.out.println©, onde c é um char, você não conseguirá número algum. System.out.println((int) c) fará mais sentido.
Mas o melhor mesmo é não usar char para isso.

É mesmo, você tem razão.
Eu troquei de matriz de char para int e funcionou. Imprimiu muitos números :slight_smile:
Agora, entender esses números vai ser chato.
Valeu Victor!
Abraço.