Baixe o app para aproveitar ainda mais
Prévia do material em texto
ÁREA II – CCEN / UFPE Disciplina: IF 165 – Computação Eletrônica – Prova Final 2017.2 Data: 12/12/2017 Nome legível do aluno: ................................................................................................. Turma ......... Observações gerais: Preencher os dados do cabeçalho do bloco de provas e na folha de questões o nome e a turma; Ao final da prova entregar ao professor ou fiscal a folha de questões e o caderno de prova; Cada quesito vale dez pontos. 1º quesito: Uma imagem é formada por uma matriz de pixels. Por exemplo, uma imagem de 200 x 300 pixels é composta por uma matriz de pixels de dimensão 200 por 300. O pixel é o elemento básico de uma imagem. Ele e composto por três cores: r (vermelho), g (verde) e b (azul). Matematicamente, os valores de r, g e b, são inteiros entre 0 e 255. Um pixel é considerado um "tom de cinza" APENAS quando r=g=b. Em todos os outros casos o pixel é designado como "colorido". No exemplo abaixo, mostramos um arquivo de uma imagem 2 x 3 pixels (a 1ª linha foi inserida apenas para a compreensão do que as colunas representam). Os pixels 12 e 22 são exemplos de "tons de cinza", enquanto os outros quatro pixels são "coloridos". R G B 180 052 136 --> pixel 11 059 059 059 --> pixel 12 162 209 175 --> pixel 13 231 044 210 --> pixel 21 110 110 110 --> pixel 22 178 231 255 --> pixel 23 O modelo do arquivo da dados considerado para o problema possui apenas três colunas de números inteiros. O número de linhas do arquivo é igual ao produto das dimensões da imagem. Crie um programa em C que transforme uma imagem "colorida" em "tons de cinza". Para isso: Declare uma estrutura chamada PIXEL, que armazene as componentes R, G e B de um pixel; Crie a função sem retorno CARREGA_IMAGEM, que tem como entradas: i) um vetor do tipo Pixel; ii) o nº de linhas do arquivo. Esta função deve ler as informações do arquivo "IMAGEM.file" e guardá-las no vetor; Crie a função sem retorno COLORIDO_PARA_CINZA, que converte um pixel "colorido" para "tons de cinza". A função tem como entrada o endereço de memória de uma variável escalar do tipo PIXEL. A conversão de "colorido" para cinza é da forma: CINZA = (r + g + b)/3; Crie a função sem retorno SAVA_IMAGEM_CINZA, que salvará a nova imagem no arquivo "IMAGEM_CINZA.file". Esta função tem como entradas: i) um vetor do tipo Pixel; ii) o nº de linhas do arquivo; iii) um ponteiro de arquivo; Na main: Peça para o usuário digitar a dimensão da imagem (nº de linha e nº de colunas), e só siga adiante no programa, se o produto destas duas variáveis estiver entre 1 e 1000. Carregue a imagem para o vetor de pixels com a função CARREGA_IMAGEM; Faça a conversão dos pixels de "colorido" para "tons de cinza" com a função COLORIDO_PARA_CINZA; Salve a nova imagem usando a função SAVA_IMAGEM_CINZA; Critério de correção Declaração da estrutura 0,75pt Declaração Variáveis 0,50pt ARQUIVOS: aberto/fechamento 1,00pt Função CARREGA_IMAGEM 2,00pt Função COLORIDO_PARA_CINZA 1,00pt Função SAVA_IMAGEM_CINZA 2,00pt Chamada das funções 1,50pt Laços da main 1,25pt #include <stdio.h> typedef struct{ int r, g, b; }Pixel; void CARREGA_IMAGEM(Pixel Q[], int n ){ int i; FILE *e =fopen("IMAGEM.file","r"); for(i=0; i<n; i++) fscanf(e,"%d %d %d", &Q[i].r, &Q[i].g, &Q[i].b); fclose(e); } void COLORIDO_PARA_CINZA(Pixel *p){ int a = (p->r + p->g + p->b)/3; p->r = a; p->g = a; p->b = a; } void SAVA_IMAGEM_CINZA(Pixel Q[], int n, FILE* p){ int i; for(i=0; i<n; i++) fprintf(p,"%d %d %d\n", Q[i].r, Q[i].g, Q[i].b); fclose(p); } int main() { Pixel M[1000]; int i,n,m; FILE* s; do{ printf("digite as dimensoes da imagem: "); fflush(stdin); scanf("%d %d", &n, &m); }while(n*m < 1 || n*m > 1000); CARREGA_IMAGEM(M, n*m); for(i=0; i<n*m; i++) COLORIDO_PARA_CINZA(&M[i]); s = fopen("IMAGEM_CINZA.file","w"); SAVA_IMAGEM_CINZA(M, n*m, s); return 0; }
Compartilhar