Manipulador de Imagens - Microphotoshop

 Faremos um programa que:


-Carregará uma imagem na memória em uma matriz (já feito)
-Processará essa imagem, como por exemplo:
-Aumentar brilho  (*)
-Diminuir brilho
-Aumentar contraste (*)
-Diminuir contraste
-Desfocar (*)
-Fazer moldura
-Girar para a esquerda
-Girar para a direita (*)
-Espelhar horizontalmente (*)
-Espelhar verticalmente
-Reforçar canais específicos de cores (R, G, B) para imagens coloridas  (veja codigo_exemplo2.c)
-Gravará a imagem alterada em arquivo  (já feito)


(*) veja em dicas


Tudo será feito agens em escala depara im cinza inicialmente (padrão P2, extensão .pgm), conforme o codigo_exemplo.c aqui presente. Preferencialmente, usem o código codigo_exemplo_simplificado.c.

Depois, usaremos imagens coloridas (padrão P3, extensão .ppm), conforme o codigo_exemplo2.c.

Para uma descrição dos formatos, veja o artigo da Wikipedia.


Software:

Para quem usa Windows:

1) Vamos usar o Gimp Portável, que pode ser baixado do link:

https://portableapps.com/apps/graphics_pictures/gimp_portable

2) Alternativamente, você pode instalar a versão convencional:

https://download.gimp.org/pub/gimp/v2.10/windows/gimp-2.10.20-setup.exe



Exercícios:


Estes são exercícios que caíram em provas passadas:

#FicaADica


1) Faça uma função que crie uma figura de uma bandeira existente:

https://thumbs.dreamstime.com/b/bandeiras-de-pa%C3%ADses-13821928.jpg

Dicas:

-Pense numa imagem de 200 linhas por 300 colunas.

-Para facilitar sua vida, escolha uma bandeira como a do Chade (3 listras verticais: azul, amarelo e vermelho), a da Costa do Marfim (3 listras verticais: laranja, branco e verde), a da França (3 listras verticais: azul, branco e vermelho), etc.


2) Faça uma função que crie uma figura semelhante a isto:


= = = = = = = = = = =
=
= = = = = = = =
= = =
= = = = = =
= = = = =
= = = =
= = = = = = =
= =
= = = = = = = = =



3) Faça uma função recursiva que pinte uma imagem de branco. Ela seria mais ou menos assim:


void pintarBranco(int** original, int linhas, int colunas, int maxValor, int inicioX, int inicioY)
{ ....
}


Dicas: 

-Se a coordenada inicioX ou inicioY estiver fora da imagem, que tem dimensões 'linhas' e 'colunas', nada será feito

-Se na coordenada (inicioX, inicioY) já houver o tom branco (maxValor), nada será feito

-Se na coordenada (inicioX, inicioY) não houver o tom branco, pinto com essa cor (maxValor)

-Invoco o procedimento recursivo para a coordenada de cima, de baixo, da esquerda e da direita

-Pronto!!!


Resposta:


void pintarBranco(int** original, int linhas, int colunas, int maxValor, int inicioX, int inicioY)
{ if(inicioX>=0 && inicioX<linhas && inicioY>=0 && inicioY<colunas && original[inicioX][inicioY] != maxValor)
{ original[inicioX][inicioY] = maxValor;
pintarBranco(original, linhas, colunas, maxValor, inicioX+1, inicioY);
pintarBranco(original, linhas, colunas, maxValor, inicioX-1, inicioY);
pintarBranco(original, linhas, colunas, maxValor, inicioX, inicioY-1);
pintarBranco(original, linhas, colunas, maxValor, inicioX, inicioY+1);
}
}






Comentários

Postagens mais visitadas deste blog