Image getRGB

Boa Noite pessoal,

Alguem sabe me dizer qual a logica que o jme usa para popular o array com os pixels da imagem na execução do metodo abaixo:

int[] imageBytes = new int[image.getWidth() * image.getHeight()];
image.getRGB(imageBytes, 0, image.getWidth(), 0, 0, image.getWidth(), image.getHeight());

Qual é a ordem que ele segue ?

Ex:
Por Linha:

imageBytes[0] = pego valor linha 0 coluna 0
imageBytes[1] = pego valor linha 0 coluna 1
imageBytes[2] = pego valor linha 0 coluna 2

ou

por coluna ex:

imageBytes[0] = pego valor linha 1 coluna 0
imageBytes[1] = pego valor linha 2 coluna 0
imageBytes[2] = pego valor linha 3 coluna 0

? :?: 8)

Alguem ja precisou fazer uma busca em array pixel? Utilizando indices, ex: x e y ?

para ler toda a imagem usa-se assim:

int lar = img.getWidth();
int alt = img.getHeight();

int pixels[] = new int[lar * alt];
img.getRGB(pixels, 0, lar, 0, 0, lar, alt);

a imagem é lida de cima pra baixo, da esquerda pra direita, sendo assim, vc acessa acessa os pixels do jeito que vc colocou no primeiro exemplo

flw, t+

Dá uma lida aqui:
http://javaboutique.internet.com/tutorials/rasters/
http://javaboutique.internet.com/tutorials/rasters2/

Pessoal,

estou usando o getRGB e ele retorna pra mim um array contendo dentro números do tipo -14671840 gostaria de saber o que significa esse número? é o código da cor? é um decimal que deve ser convertido para hexa para achar o código da cor? o que seria isso?

desde já muito obrigado.

A cor é formada por 3 bytes (ou 4, caso tenha canal alfa).

Esses bytes são gravados numa variável do tipo int, e a classe de imagem usa geralmente o formato A[color=red]R[/color][color=green]G[/color][color=blue]B[/color] para representa-la.

Como vc sabe, um inteiro possui 4 bytes.

Então, uma cor com 255 (0xFF) no alfa, e 50 (0x32) no vermelho, 30 (1E) no verde e 10 (0A) no azul, será representada assim:
0xFF[color=red]32[/color][color=green]1E[/color][color=blue]0A[/color]

Ou, em binário:
1111 1111 [color=red]0011 0010[/color] [color=green]0001 1110[/color] [color=blue]0000 1010[/color]

Se a variável fosse long, isso seria o número 4281474570. Como o java não tem sinal, aquele primeiro bit é interpretado como um bit de sinal, e os demais como o valor do número. Como o valor do primeiro bit é 1, indica que o número é negativo, e portanto, o número todo, com os mesmos bits será exibido como: -13492725.

O ideal, para trabalhar com esse número, é aplicar máscaras de bits e utilizar cada byte da cor separadamente. Por exemplo, para extrair o canal vermelho da imagem, no padrão ARGB, você faria:

int mascaraVermelho = 0x00FF0000; int bytesVermelhos = (corPixel & mascaraVermelho) >> 16; System.out.println(bytesVermelhos); //Imprime 50.

A classe Color faz esse tipo de operação automaticamente.

Leia também esses tutoriais do Ponto V, pois vão te ajudar:
http://www.pontov.com.br/site/index.php/arquitetura/51-programacao/186-imagens-digitais
http://www.pontov.com.br/site/index.php/opengl/182-cores

Vc vai pro céu com tanta paciência para esmiuçar assim.

Algo tão já batido e discutido aqui e nem perco mais tempo.

Se a busca do GUJ tem problema, fazer o quê, né ?

A resposta vai ser perdida e nunca mais encontrada. Por isto sempre venho aqui para ler sobre assuntos diversos pois sempre estou aprendendo algo e mantendo atualizado.

Como eu disse, esta questão dos pixels, representação da informação no array,etc, já foi discutida aqui diversas vezes…