Pergunta

Como posso converter um valor em escala de cinza (0-255) em um valor/representação RGB? É para usar em uma imagem SVG, que parece não vir com um suporte em escala de cinza, apenas RGB ...

Nota: Isso não é RGB -> GrayScale, que já é respondido em outra pergunta, por exemplo Convertendo RGB em escala de cinza/intensidade)

Foi útil?

Solução

A abordagem rápida e suja é repetir a intensidade da escala de cinza para cada componente do RGB. Portanto, se você tem escala de cinza 120, ele se traduz em RGB (120, 120, 120).

Isso é rápido e sujo, porque a luminância efetiva que você obtém depende da luminância real dos subpixels R, G e B do dispositivo que você está usando.

Outras dicas

Se você tem o valor da escala de cinza em uma variável e deseja produzir um novo valor no formulário 0x00rrggbb, uma maneira rápida de fazer isso é:

int rgb = grey * 0x00010101;

ou equivalente em sua linguagem escolhida.

A conversão de uma escala de cinza em RGB é simples. Basta usar r = g = b = valor cinza. A idéia básica é que a cor (como visualizada em um monitor em termos de RGB) é um sistema aditivo.

http://en.wikipedia.org/wiki/additive_color

A adição de vermelho ao verde rende amarelo. Adicione um pouco de azul a essa mistura em quantidades iguais e você obtém uma cor neutra. Full em [vermelho, verde, azul] = [255 255 255] produz branco. [0,0,0] Os rendem o monitor de preto. Os valores intermediários, quando r = g = b são iguais, produzirão cores nominalmente neutras do nível especificado de cinza.

Um problema menor depende de como você vê a cor, pode não ser perfeitamente neutro. Isso dependerá de como o seu monitor (ou impressora) é calibrado. Existem profundidades interessantes da ciência das cores em que poderíamos entrar a partir deste ponto. Vou parar por aqui.

A escala cinza significa que todos os valores têm a mesma intensidade. Defina todos os canais (em RGB) iguais ao valor de cinza e você terá a imagem preta e branca RGB.

Não configurará R, G e B para o mesmo valor (o valor da escala de cinza) para cada pixel, para você um tom correto de cinza?

Você também pode dar uma olhada na minha solução Montagem mais rápida maneira otimizada para converter a imagem RGB8 em imagem RGB32. O canal cinza é simplesmente repetido em todos os outros canais.

O objetivo era encontrar a solução possível de jejum para conversão usando x86/sse.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top