• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

softklin

Misturar cores para obter uma nova

15 mensagens neste tópico

Pessoal, é o seguinte: estou a fazer um trabalho, e uma das etapas desse trabalho é dadas 2 cores no formato RGB, criar uma função que as misture. Ou seja, se tivermos, por exemplo, uma cor azul e outra cor amarela, devemos obter uma cor verde.

O problema é que não percebo nada cores :) E como tal não sei qual o algoritmo necessário para este processo. Já tentei procurar no motor de pesquisa, a única conclusão a que cheguei é que não era possível em RGB, e tinha de se converter para um formato esquisito, algo como l*a*b, ou similiar...

Alguém conhece um algoritmo que faça o que pretendo?

Cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

elcsat, obrigado pelo PDF, tem lá muitas coisas interessantes sobre as cores. No entanto, não consegui encontrar referências a misturas de cores em RGB. Porém, deu para ter a noção que se cada componente g, r e b, referem-se à, luminosidade de cada cor respectiva, vermelho, verde e azul, estarei certo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes usar o formato hexadecimal para misturar as cores.

#RRGGBB

se tiver tudo a zero é preto -> #000000

tudo no máximo é branco -> #FFFFFF

Vermelho -> #FF0000

Verde -> #00FF00

Azul -> #0000FF

Agora podes ir misturando as cores. usando valores entre 0 e F, vai experimentando

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não me parece que vá ser muito fácil...

Encontrei isto:

http://en.wikipedia.org/wiki/Lab_color_space#RGB_and_CMYK_conversions

Pois, não me parece fácil. E pensando bem, acho que já é demasiado complexo para o que me pedem para fazer.

Podes usar o formato hexadecimal para misturar as cores.

#RRGGBB

se tiver tudo a zero é preto -> #000000

tudo no máximo é branco -> #FFFFFF

Vermelho -> #FF0000

Verde -> #00FF00

Azul -> #0000FF

Agora podes ir misturando as cores. usando valores entre 0 e F, vai experimentando

Estou a trabalhar com inteiros, mas vai dar ao mesmo. A minha ideia inicial de juntar cores era somá-las, e garantir qe não ultrapasse os 255. Funciona para algumas cores, mas por exemplo, se misturarmos tinta branca com tinta preta, obtemos um tom cinza. Com a minha ideia ficaria rgb(0, 0, 0) (preto) + rgb(255, 255, 255) (branco) que daria branco...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

soma e depois divide por 2. nunca passa os 255, ver se da assim

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, não me parece fácil. E pensando bem, acho que já é demasiado complexo para o que me pedem para fazer.

Estou a trabalhar com inteiros, mas vai dar ao mesmo. A minha ideia inicial de juntar cores era somá-las, e garantir qe não ultrapasse os 255. Funciona para algumas cores, mas por exemplo, se misturarmos tinta branca com tinta preta, obtemos um tom cinza. Com a minha ideia ficaria rgb(0, 0, 0) (preto) + rgb(255, 255, 255) (branco) que daria branco...

Boas,

Fiquei agora a mesmo a conhecer o forum ;)

1º Post...

Softclean,

já experimentaste operações logicas em cada canal de côr?

ex: misturar vermelho com azul

    0xFF0000 OR 0x0000FF = 0xFF00FF -> Roxo

Podes aplicar percentagens também, o que funcionaria para o caso da tinta branca "+" tinta preta

ex: cinzento = cor preta + X% de cor branca ( 100% = 255)

    50% cinzento = 0x000000 OR 0x808080   

Talvez resolvesse o problema.

Cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Joseerodrigues, bem-vindo! :D Boa ideia essa da operação lógica sobre hexadecimais. Só não a vou usar porque estou a fazer um trabalho em que me pedem para gerir inteiros. Podia converter para o formato hexadecimal, é verdade, mas estou atrasado no trabalho, e não quero perder muito tempo com esta função, que deve ser das coisas mais básicas. :P

Vou usar a ideia do elcsat (acho que é semelhante, porém trabalha logo com inteiros). Obrigado a todos os que me ajudaram!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ex: misturar vermelho com azul

    0xFF0000 OR 0x0000FF = 0xFF00FF -> Roxo

Podes aplicar percentagens também, o que funcionaria para o caso da tinta branca "+" tinta preta

ex: cinzento = cor preta + X% de cor branca ( 100% = 255)

    50% cinzento = 0x000000 OR 0x808080   

A grande questão aqui é se estamos a falar de tinta ou de luz, porque, como já deves ter percebido, os comportamentos são completamente diferentes.

A ideia do elcsat não é equivalente à que estava a ser apresentada porque fazer um OR binário vai, considerar as cores bit-a-bit quando os bits individuais não têm significado (a única coisa que tem significado é o byte que representa cada uma das cores). Para além disso é fácil ver que as ideias são diferentes porque:

modelo do elcsat:

(Vermelho intenso 0xFF0000 + Azul intenso 0x0000FF) / 2 = 7F007F (roxo com intensidade "média")

Enquanto que no do joseerodrigues tens roxo com intensidade "máxima" que é o valor lógico neste caso.

Acho que se te limitares a somar as cores e a pôr um limite em 255 é capaz de também n ficar mto mal...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu dei o exemplo das tintas porque como disse em cima, não percebo nada de cores, e apenas usei um exemplo do senso comum, a tinta, porque pensei que funcionava da mesma forma. Mas também já tinha lido noutro lado que era a intensidade das cores, e com o teu post, confirmei isso.

Eu não estou a ser muito rigoroso, porque como disse também em cima, é apenas uma função de uma classe, entre outras que tenho de desenvolver. Se a cor é mais escura ou mais clara, penso que não seja relevante no meu caso, mas fizeram bem em colocar essas distinções, pode haver pessoal que queira coisas mais especializadas e assim tem as diferentes hipóteses.

Cumps :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu nao entendo nada de cores, eu dei aquele exemplo por da..mas nao sei como se misturam nem nada...nem tenho interesse em saber isso :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Joseerodrigues, bem-vindo! ;) Boa ideia essa da operação lógica sobre hexadecimais. Só não a vou usar porque estou a fazer um trabalho em que me pedem para gerir inteiros. Podia converter para o formato hexadecimal, é verdade, mas estou atrasado no trabalho, e não quero perder muito tempo com esta função, que deve ser das coisas mais básicas. :)

Vou usar a ideia do elcsat (acho que é semelhante, porém trabalha logo com inteiros). Obrigado a todos os que me ajudaram!

Um inteiro é um hexadecimal. Quer dizer, hexadecimal é uma representação de um inteiro. Veres o número em decimal, hexadecimal, octal, etc... são várias representações do mesmo número.

Dizeres que terias de converter para hexadecimal não tem lógica nenhuma. Podias dizer que convertias o inteiro para uma string em que contia a representação hexadecimal do inteiro. Mas aí já estarias a trabalhar com strings e claro operações lógicas não funcionam nelas. Portanto as operações lógica indicadas seriam para serem usadas sobre os inteiros.

Espero ter-me feito entender...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora