Duvida em expressão besta

4 respostas
luistiagos

estou fazendo uma api de manipulação de imagem e como faz tempo q não trampo com isto me surgiu uma duvida besta em uma expressãozinha…
se:

int x = -8875214;
x = ((x & 0xff0000) >> 16);

x tera um resultado neste exemplo 120…

porem caso eu queria fazer o inverso disto?
como atravéz do 120 eu chego em -887514

4 Respostas

E

Não chega. Você perdeu informação, ao fazer x & 0xFF0000.

Basta ver o que ocorreu em hexadecimal:
x recebeu -8875214 (que em hexadecimal é 0xFFF27526)
Ao fazer x & 0xFF0000 você obteve o resultado 0x00F20000
Aí você deslocou 2 bytes para a direita, tendo o resultado 0xF2.

Você não consegue voltar para trás, mesmo deslocando 2 bytes para a esquerda (você perdeu os bytes 75 e 26).

ViniGodoy

Você consegue se tiver separado as cores nos seus 3 componentes. E ainda tiver os 3 componentes.

Por exemplo:

int cor = -8875214; int r = ((cor & 0xff0000) >> 16); int g = ((cor & 0x00FF00) >> 8); int b = ((cor & 0x0000FF);

Para restaurar a cor com base no R, G e B:

int corRestaurada = (r << 16) | (g << 8) | b;

Na sua expressão original, o 120 só referia ao componente vermelho. O 0xFF0000 zera os componentes verdes e azul. Sem guardar isso em algum momento, é a tal informação perdida que o entanglement citou.

luistiagos

sim mas par grayscale como fica?

E

Para você converter uma cor para uma escala de cinza, você precisa achar uma fórmula que combine os componentes R, G e B para achar um número de 0 até 255, que será repetido nos três componentes.

http://en.wikipedia.org/wiki/Grayscale menciona uma fórmula:

Descontando o blábláblá, isso quer dizer, mais ou menos, que você deve multiplicar R por 0,3, G por 0,59 e B por 0,11 para obter o valor do tom de cinza.

Obviamente essa é uma conversão irreversível (você não pode, a partir de um tom de cinza, dizer que aquilo era azul ou roxo ou marrom ou vermelho :slight_smile: )

Criado 26 de agosto de 2010
Ultima resposta 27 de ago. de 2010
Respostas 4
Participantes 3