Misturar cores para obter uma nova - Dúvidas e Discussão de Programação - Portugal-a-Programar
Misturar cores para obter uma nova
By softklin, April 15, 2009 in Dúvidas e Discussão de Programação
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?
por acaso tenho um pdf que explica isso muito bem a formaçao de todas as cores...
eu baixeio para o rapishare para poderes sacar, ai vai o link
http://rapidshare.com/files/221780671/3425_Editores_para_Web.rar.html
espero que te seja util
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?
Podes usar o formato hexadecimal para misturar as cores.
se tiver tudo a zero é preto -> #000000
tudo no máximo é branco -> #FFFFFF
Vermelho -> #FF0000
Azul -> #0000FF
Agora podes ir misturando as cores. usando valores entre 0 e F, vai experimentando
Não me parece que vá ser muito fácil...
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.
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...
soma e depois divide por 2. nunca passa os 255, ver se da assim
Fiquei agora a mesmo a conhecer o forum
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.
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!
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...
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.
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
facto é que ajudou
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.