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

Sign in to follow this  
softklin

Misturar cores para obter uma nova

Recommended Posts

softklin

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.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
softklin

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?


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
bruno1234

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


Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Share this post


Link to post
Share on other sites
softklin

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


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
joseerodrigues

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.

Share this post


Link to post
Share on other sites
softklin

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!


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
pedrosorio

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


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
softklin

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


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
elcsat

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:

Share this post


Link to post
Share on other sites
Betovsky

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


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.