Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

pinguim

32bit color to 8bit color

Mensagens Recomendadas

pinguim

Ola pessoal, sou novo por aqui :P

Provavelmente nem estou a postar no sitio certo para esta pergunta xD

Tenho um pequeno trabalho para fazer e gostava que me ajudassem com ideias simples para converter uma imagem qualquer (não importa se tem ou não de haver limitações de tipo de imagem) para uma imagem de resolução 320x200 e com apenas 256 cores (8bit)

Provavelmente estou a falar de algo muito vago

Resumindo, procuro informações de como manipular imagens a nível de resolução e cor, de uma maneira muito simples, usando apenas C ou C++

Se puder ajudar aqui, com muita paciência, Obrigado :)


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Metaluim

se for de 32 bits para 8 bits, basta pensares que um inteiro de 32 bits que representa um pixel, tem 8 bits para cada canal (ARGB) enquanto que um de 8 bits tem 3 bits para o R, 3 para o G e 2 para o B, não tendo nenhum canal de transparência.

tens aqui um exemplo: http://www.codeproject.com/KB/graphics/Image_Bitdepth_Conversion.aspx

quanto ao importar o ficheiro, podes usar alguma libraria que já te faz isso ou simplesmente analisar a definição do ficheiro (se for standard), por exemplo em .png: http://tools.ietf.org/html/rfc2083

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

Hmm talvez não me tenha explicado bem não sei

Já deram grande ajuda seja como for

No entanto vou explicar o meu problema melhor desta vez

Eu tenho um projecto que bascimante tenho de exibir uma imagem em ambiente DOS (atravez de Assembley 8086)

A ideia seria criar um programa (que já fiz, em C#) que me fosse dando a informação de cada pixel, (mais propriamente a sua cor) e ir escrevendo o codigo correspondente em Assembley.

Até aqui tudo bem, o problema eh a compatibilidade de cores... De facto o Assembler usa uma cor de 8-bits, no entanto não eh RGB

E mesmo que fosse, tb teria duvidas em como criar um algoritmo que me convertesse RGB de 3bytes para um RGB de 1byte...

Penso, no entanto, que isso me seja inutil...

A minha ideia inicial seria fazer uma especie de "tabela" que correspondesse as duas cores, manualmente, no entanto acredito haver uma maneira melhor de fazer isso :/

Agradeço desde já a ajuda ^^

NOTA: Eu não estou a procura de codigo (pelo menos para já), mas sim de um algoritmo, pq em tendo o mesmo eh soh por as mãos ah obra :D

Já agora, as linguagens que tenho minimamente conhecimento são C,C++,C#, Assembley e Pascal, espero ser o suficiente!


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

Queria voltar a aquecer o post, de maneira a que me podessem mesmo ajudar com isto

Tenho andado tambem a pensar na questão, e a unica solução que encontrei ate agora seria fazer um ficheiro (ah mão mesmo) que no fundo contesse os codigos RGB correspondentes ao numero da cor em Assembley...

depois corria esta tabela e a que tivesse mais perto da cor do pixel que estou a ler actualmente, seria a cor escolhida para representar no assembley...

Por exemplo:

RGB              Assembley

255 20 30 = 47

255 10 10 = 32

255+20+30 - 255+16+20 = 14

255+10+10 - 255+16+20 = 16

Cor do pixel actual:

234 16 20

Cor escolhida:

255 20 30 = 47

(seria a cor com a menor diferença possivel, somando as diferenças de todos os canais de cor RGB)

No entanto não acho muito eficiente, pois se a cor do pixel actual fosse

234 15 20, a diferença entre as duas cores seria igual, o que poderia gerar conflito... como tal ou arranjaria uma melhor maneira ou então uma condição que , no caso de encontrar duas diferenças iguais, decidisse qual das duas usar

Por favor, mesmo que não entendam a minha duvida ou não estejam a ver como ajudar, tentem... Se alguem souber alguma ideia, ou já conheçam algum algoritmo para fazer isto, digam.

Obrigado :D


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Metaluim

como assim, uma cor 8 bits que não é RGB? E os exemplos que destes até agora, têm sido sempre 24 bits (8 + 8 + 8).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Triton

No outro post nem te ajudei como deve ser.

Curiosamente estava a pesquisar sobre isto, e existe alguma teoria por detrás do que queres fazer.

Como vais ter menos cores na imagem, o melhor que tens a fazer é escolher um certo número delas e criar uma imagem com uma palette (http://en.wikipedia.org/wiki/Portable_Network_Graphics#Color_depth).

A operação chama-se quantization (http://en.wikipedia.org/wiki/Color_quantization). Também existe uma técnica para melhorar a qualidade da imagem reduzida chamada dithering (http://en.wikipedia.org/wiki/Dithering#Digital_photography_and_image_processing).

Espero que isto ajude.


<3 life

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

@ Metalium - A cor que eu retiro do pixel do ficheiro original eh uma cor de 32 bits

O objectivo eh converte.la da maneira que ja expliquei em cima

A cor inicial (retirada do pixel do Bitmap) eh um ARGB (32 bits)

24 bits eh depois de retirado o A, ficando apenas 8R,8G e 8B....

Ate agora, eh so isto que tenho, uma cor RGB de 24 bits, e quero passar para um numero de 0 a 255 que define uma cor em Assembley...

@ Triton - Eu sei que eh pedir muito, mas precisava mesmo eq me explicasses qual eh a ideia aqui... Eh aquela que eu disse? construir uma tabela com base nas cores do Assembley correspondente as cores equivalente de 24 bits RGB, tal como exemplefiquei ali em cima?

Se não, qual seria a ideia?

Se sim, como resolvo o problema de encontrar cores diferentes mas com a mesma "distancia" ah cor original do pixel da imagem escolhida...?

Quanto mais cedo responderem melhor, obrigado pela ajuda


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.