Dúvida getRGB() [RESOLVIDO]

10 respostas
tiu_kraudio

Aê, galera. Estou com uma dúvida num código. Alguém poderia dar um help, please?

int r = getR(imagem.getRGB(x, y));
int g = getG(imagem.getRGB(x, y));
int b = getB(imagem.getRGB(x, y));

private int getR(int r) {
       return 0
          << 24
             | ((r << 16) & 0x00FF0000)
             | ((0 << 8 ) & 0x0000FF00)
             | (0 & 0x000000FF);
    }
    private int getG(int g) {
       return 0
          << 24
             | ((0 << 16) & 0x00FF0000)
             | ((g << 8 ) & 0x0000FF00)
             | (0 & 0x000000FF);
    }
    private int getB(int b) {
       return 0
          << 24
             | ((0 << 16) & 0x00FF0000)
             | ((0 << 8 ) & 0x0000FF00)
             | (b & 0x000000FF);
    }

Eu até consigo perceber que o que o código está fazendo é pegando o RGB de uma imagem qualquer. O que queria entender são esses módulos getR(), getG e getB. Aparentemente eles servem para pegar cada um dos componentes do RGB separadamente. Se for isso mesmo alguém poderia me explicar sobre os números em hexadecimal, esses sinais de << (não sei se esta comparando com alguma coisa :? ), etc... Penso que se eu conseguir entender essa parte ela será de grande utilidade numa aplicação que estou fazendo.

Desde já agradeço...

[]s

10 Respostas

E

<< serve para deslocar bits para a esquerda.

Se você quer deslocar de 1 byte, então você tem de deslocar de 8 em 8 bits.

Por exemplo,

(0x000000CA << 8 ) == 0x0000CA00

veja que o byte CA foi deslocado de 1 byte para a esquerda.

& é a operação de AND binário. Ou seja, “qualquer coisa & zero” se torna zero, e “qualquer coisa & um” é inalterada.

Normalmente isso serve para separar bits. Você deve saber converter hexadecimal (base 16) para binário.

Por exemplo,

(0xCAFEBABE & 0x00FF0000) == 0x00FE0000

tiu_kraudio

entanglement:
<< serve para deslocar bits para a esquerda.

Se você quer deslocar de 1 byte, então você tem de deslocar de 8 em 8 bits.

Por exemplo,

(0x000000CA << 8 ) == 0x0000CA00

veja que o byte CA foi deslocado de 1 byte para a esquerda.

& é a operação de AND binário. Ou seja, “qualquer coisa & zero” se torna zero, e “qualquer coisa & um” é inalterada.

Normalmente isso serve para separar bits. Você deve saber converter hexadecimal (base 16) para binário.

Por exemplo,

(0xCAFEBABE & 0x00FF0000) == 0x00FE0000

valeu pela ajuda, brother… eu consegui entender um pouco… mas ainda assim tem umas coisas meio obscuras nessas partes do código:

private int getR(int r) { return 0 << 24 | ((r << 16) & 0x00FF0000) | ((0 << 8 ) & 0x0000FF00) | (0 & 0x000000FF); }

Alguém consegue entender o que o código está fazendo nessa parte? Esses pipes (|) significam “OU”? Se for parece q ele retorna 0 deslocado em 3 bytes ou r deslocado em 2 bytes & 0x00FF0000 (ele retorna 0 ou 1 aqui?) ou sei lá mais o que… :?

E

Ah, é isso mesmo. o “|” representa o “ou” binário (ou seja, “|” com 1 é sempre 1, e “|” com 0 é o valor original. )
Ele serve para “juntar” as coisas. Por exemplo:

(0x[color=red]CAFE[/color]0000 | 0x0000[color=blue]BABE[/color]) == 0x[color=red]CAFE[/color][color=blue]BABE[/color]

Isso, supondo-se que você esteja juntando coisas com posições já zeradas.

E

E “0 << qualquer coisa” é sempre 0.

O código que você viu provavelmente está fazendo isso para lhe confundir.

ViniGodoy

Esse código está desnecessariamente rebuscado, e parece que está errado também:

private int getA(int rgba) {  
   return (rgba & 0xFF000000) >> 24;  
} 

private int getR(int rgba) {  
    return (rgba & 0xFF0000) >> 16;  
} 
 
private int getG(int rgba) {  
   return (rgba & 0xFF00) >> 8;
}  

private int getB(int rgba) {  
   return rgba & 0xFF;  
}
tiu_kraudio

entanglement:
E “0 << qualquer coisa” é sempre 0.

O código que você viu provavelmente está fazendo isso para lhe confundir.

Vlw, brother… Brigadaum!!!

tiu_kraudio
ViniGodoy:
Esse código está desnecessariamente rebuscado, e parece que está errado também:
private int getA(int rgba) {  
   return (rgba & 0xFF000000) >> 24;  
} 

private int getR(int rgba) {  
    return (rgba & 0xFF0000) >> 16;  
} 
 
private int getG(int rgba) {  
   return (rgba & 0xFF00) >> 8;
}  

private int getB(int rgba) {  
   return rgba & 0xFF;  
}

vlw, vini... tbm achei bem confuso o código do cara hehehe... o que eu preciso eh pegar a quantidade de vermelho, de verde e de azul separadamente... vou testar a sua idéia...

[]s

ViniGodoy

Existem vários padrões de cor. As funções que escrevi assumem o padrão ARGB, que é um padrão comum, e o padrão para o qual a função getRgb() converterá todas as imagens. Você ainda pode ter o padrão RGB (nesse caso o alfa sempre virá zerado), BGR, RGBA, etc… A única coisa que muda nesses padrões é a posição dos bits. Agora, existem outros padrões que envolvem compatação, como o r5g6b5. Tem que tem 5 bits para o vermelho, 5 para o azul e 6 para o verde.

Agora, algumas funções mais performáticas, envolvem usar o Raster diretamente, e ele pode não converter esse padrão. Portanto, é bom saber que isso existe. :wink:

tiu_kraudio

ViniGodoy:
Existem vários padrões de cor. As funções que escrevi assumem o padrão ARGB, que é um padrão comum, e o padrão para o qual a função getRgb() converterá todas as imagens. Você ainda pode ter o padrão RGB (nesse caso o alfa sempre virá zerado), BGR, RGBA, etc… A única coisa que muda nesses padrões é a posição dos bits. Agora, existem outros padrões que envolvem compatação, como o r5g6b5. Tem que tem 5 bits para o vermelho, 5 para o azul e 6 para o verde.

Agora, algumas funções mais performáticas, envolvem usar o Raster diretamente, e ele pode não converter esse padrão. Portanto, é bom saber que isso existe. :wink:

Vlw, brother… passei só prá agradecer mesmo… funcionou certinho… brigadão…

[]s

E

Alguém pode me ajudar nesse código.

public static int limiarizatePixel(int pixel, int threshold) {
        
        return convertPixel((((convertToGrayscale(pixel) & 0x00FF0000) >>> 16) > threshold) ? 255 : 0);
    }
Criado 16 de outubro de 2009
Ultima resposta 26 de nov. de 2014
Respostas 10
Participantes 4