Dúvida getRGB() [RESOLVIDO]

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

[code]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);
}[/code]

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

<< 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

[quote=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[/quote]

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… :?

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 “0 << qualquer coisa” é sempre 0.

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

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

[code]
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;
} [/code]

[quote=entanglement]E “0 << qualquer coisa” é sempre 0.

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

Vlw, brother… Brigadaum!!!

[quote=ViniGodoy]Esse código está desnecessariamente rebuscado, e parece que está errado também:

[code]
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;
} [/code] [/quote]

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

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:

[quote=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: [/quote]

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

[]s

Alguém pode me ajudar nesse código.

[code] public static int limiarizatePixel(int pixel, int threshold) {

    return convertPixel((((convertToGrayscale(pixel) & 0x00FF0000) >>> 16) > threshold) ? 255 : 0);
}[/code]