Image getRGB

6 respostas
renanpto

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)

6 Respostas

renanpto

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

quikkoo

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+

ViniGodoy

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

C

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.

ViniGodoy

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 [telefone removido]. 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

P

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…

Criado 22 de maio de 2008
Ultima resposta 18 de fev. de 2011
Respostas 6
Participantes 5