Raster.getPixels() - Erro de coordenada

Bom dia,
Eu estou a utilizar a classe Raster e o método getPixels para obter um determinado retângulo de uma imagem, porém só consigo se o x e y for igual a 0.

Estou fazendo isto:

int[] buffer = new int[4440]; raster.getPixels(0, 0, 1480, 1, buffer);

Porque será que quando faço assim da erro:

int[] buffer = new int[4440]; raster.getPixels(1, 0, 1480, 2, buffer);

Seria algo assim, quero pegar linha por linha, o que estou fazendo de errado?

Eu até dei uma olhada na doc, mas pelo que vi estou a fazendo certo :frowning:
http://java.sun.com/javase/6/docs/api/java/awt/image/Raster.html#getPixels(int,%20int,%20int,%20int,%20int[])

Ahh, já ia me esquecendo, a minha imagem tem: 1480x1024.
Em tese não poderia dar erro, pois veja bem, do pixel 1 até o 2 na coordenada X, e na Y todas as 1480

Obrigado

O primeiro parâmetro refere-se ao x, ou seja, as colunas.
Para variar a linha, varie o segundo parâmetro.

As classes de manipulação de imagem seguem a notação matemática (x,y). x sempre se refere a linha, y sempre se refere as colunas. Por isso, também fornecemos a largura antes da altura.

Alguns programadores confundem porque usamos a notação linha/coluna quando manipulamos texto. O que era também muito comum nos antigos programas do DOS.

ViniGodoy:
Obrigado!
Viajei mesmo, acho que estou dormindo ainda hehe…

Nem esquenta. Quando comecei na computação gráfica, também errava isso direto (até editei o post ali em cima e falei um pouco o porque…)

Obrigado pela força Vini :slight_smile:

Estou com outra dúvida, vou pedir aqui mesmo para não abrir outro tópico.

Tenho um array de inteiros, int[0] = ALGUM NUMERO, int[1] também…
Tenho um array de bytes, byte[0] = O QUE TEM AQUI??
O que é que um array de bytes é??

Eu preciso converter um array de int para array de bytes primeiramente, e depois desfazer isto, mas primeiro preciso saber o que que um array de bytes leva consigo, o que seriam os bytes?

Obrigado!

1 inteiro é formado por 4 bytes.

No caso de informações de cor, cada byte carrega um componente da cor. Os componentes podem ser vermelho ®, verde (G) ou azul (B). No caso de imagens com transparência o próximo componente é o alfa (A), mas não creio que seja o seu caso (já que vc multiplicou o tamanho do array por 3, e não 4).

A ordem dos componentes varia entre os diferentes formatos de imagem, não me lembro exatamente onde o Java guarda essa informação. Mas os pixels podem começar pelo vermelho (RGBA), azul (BGRA) ou ter compactação (R5G6B5).

Não sei se o Java já armazena os 4 componentes em um único int, ou se você precisa separar os componentes manualmente, usando máscaras de bits. Se ele carregar os 4 componentes em um só int, não será necessário criar um array de tamanho multiplicado por 3 para ler os ints (ou 4, no caso de ter alpha), como você fez. Aí vc terá que usar máscaras de bits para separar cada um dos componentes, para grava-lo em único byte. O array de bytes sim, terá o tamanho multiplicado pelo número de componentes. Por exemplo:

byte bytePixels[] = new byte[pixels.length*3];
for (int i = 0; i < pixels.length; i+=3) {
   bytePixel[i] = (byte)(pixels[i] & 0xFF) //num RGB seria o B;
   bytePixel[i+1] = (byte)((pixels[i] & 0xFF00) >> 8) //num RGB seria o G;
   bytePixel[i+2] = (byte)((pixels[i] & 0xFF0000) >> 16) //num RGB seria o R;
}

Se cada componente já vier separado, aí é só uma questão de fazer um downcast:

byte bytePixels[] = new byte[pixels.length]; for (int i = 0; i < pixels.length; i++) { bytePixel[i] = (byte)pixels[i]; }

Recentemente, fiz um artigo sobre texturas em OpenGL, que mostra como a SDL trata esse assunto:
http://vinigodoy.wordpress.com/2008/08/11/carregando-imagens-com-a-sdl/

A SDL suporta inclusive formatos com compactação. Não creio que o Java seja diferente, você terá que pesquisar um pouco mais sobre onde o Java armazena a informação de quantos bits estão sendo usados para armazenar cada componente.

Claro, se o formato da imagem for conhecido, você não precisará tratar todos esses detalhes em código. Mas é bom saber que eles existem.

Valeu ai cara.

Na verdade ele não armazena, por isso usei *3… mas foi difícil pra mim descobrir que era por 3, fiquei vendo que dava algumas excessões, ai fui trabalhando até que descobri que era relativo ao RGB :), porém o 4º eu nem fazia idéia, no meu caso não tem mesmo…

Vou tentar fazer o que você disse ali.
Obrigado!