1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | // ******************************************************* // Programa que lê um arquivo, e coloca todo o conteúdo // em um vetor de bytes // // Para compilar: // gcc Carrega.c -o Carrega // Para executar // ./Carrega Arquivo.ppm // // ******************************************************* #include <stdio.h> #include <stdlib.h> #include <string.h>
// ******************************************************* // Função que grava os bytes em um aquivo // ******************************************************* void GravaArquivo(FILE* f, unsigned char* ptr, int tamanho) { unsigned long NroDeBytesGravados; NroDeBytesGravados = fwrite(ptr, sizeof(unsigned char), tamanho, f); if(NroDeBytesGravados != tamanho) { // verifica se a gravacao funcionou printf("Erro na gravacao do arquivo!\n"); exit(1); } else printf("Gravacao realizada com sucesso! (%ld)\n", NroDeBytesGravados); }
// ******************************************************* // Determina o novo tamanho da imagem, após a correção // Esta função deverá ser alterada // ******************************************************* void CalculaTamanhoDaImagemDeSaida(unsigned char *dados, unsigned long TamanhoDoArquivo, unsigned long* NovoTamanho) { *NovoTamanho = TamanhoDoArquivo; } // ******************************************************* // Realiza o processamento da imagem de entrada // Esta função deverá ser alterada // ******************************************************* unsigned char* ProcessaImagem(unsigned char* Entrada, unsigned long TamanhoInicial, unsigned long TamanhoFinal) { printf("%s\n", Entrada); // Aloca memória para a imagem de saída unsigned char *ptr; ptr = (unsigned char*)malloc(sizeof(unsigned char) * TamanhoFinal); if(ptr == NULL) { // Testa se conseguiu alocar printf("Erro na alocação da memória!\n"); exit(1); }
// printf("Processando...\n"); memcpy(ptr, Entrada, TamanhoFinal); return ptr; } // ******************************************************* // Função que le os bytes de um aquivo // ******************************************************* void LeArquivo(FILE* f, unsigned char* ptr, unsigned long TamanhoEsperado) { unsigned long NroDeBytesLidos; NroDeBytesLidos = fread(ptr, sizeof(unsigned char), TamanhoEsperado, f);
if(NroDeBytesLidos != TamanhoEsperado) { // verifica se a leitura funcionou printf("Erro na Leitura do arquivo!\n"); printf("Nro de bytes lidos: %ld", NroDeBytesLidos); exit(1); } else printf("Leitura realizada com sucesso!\n"); } // ******************************************************* // Função que obtém o tamanho de um arquivo em bytes. // ******************************************************* unsigned long ObtemTamanhoDoArquivo(FILE* f) { fseek(f, 0, SEEK_END); unsigned long len = (unsigned long)ftell(f); fseek(f, SEEK_SET, 0); return len; }
// ******************************************************* // Função que lê a imagem PPM "incorreta" // ******************************************************* unsigned char* LeImagemDeEntrada(char *nomeEntrada, unsigned long *tamEntrada) { FILE* arq; // Tenta abrir o arquivo arq = fopen(nomeEntrada, "rb"); if(arq == NULL) { printf("Arquivo %s não existe.\n", nomeEntrada); exit(1); } *tamEntrada = ObtemTamanhoDoArquivo(arq); printf("O tamanho do arquivo %s é %ld bytes.\n", nomeEntrada, *tamEntrada);
// Aloca memória para ler todos os bytes do arquivo unsigned char *ptr; ptr = (unsigned char*)malloc(sizeof(unsigned char) * *tamEntrada); if(ptr == NULL) { // Testa se conseguiu alocar printf("Erro na alocação da memória!\n"); exit(1); } LeArquivo(arq, ptr, *tamEntrada); fclose(arq); // fecha o arquivo return ptr; } // ******************************************************* // Função que grava a imagem PPM "corrigida" // ******************************************************* void GravaImagemProcessada(char *nome, unsigned char* NovosDados, unsigned long NovoTamanho) { printf("Criando arquivo %s.\n", nome); // Cria o arquivo FILE* arqSaida; arqSaida = fopen(nome, "wb"); if(arqSaida == NULL) { printf("Erro na criacao do arquivo %s.\n", nome); exit(1); } else printf("Inciando gravacao do arquivo %s.\n", nome); // Grava o vetor em disco GravaArquivo(arqSaida, NovosDados, NovoTamanho); fclose(arqSaida); } // ******************************************************* // ******************************************************* int main(int argc, char** argv) { // Testa se o programa recebeu o nome do arquivo na linha de comando if(argc != 2) { printf("CorrigePPM [filename]\n"); exit(1); }
unsigned long TamanhoDoArquivo; unsigned char* Dados; Dados = LeImagemDeEntrada(argv[1], &TamanhoDoArquivo);
unsigned char* NovosDados; unsigned long NovoTamanho;
CalculaTamanhoDaImagemDeSaida(Dados, TamanhoDoArquivo, &NovoTamanho); NovosDados = ProcessaImagem(Dados, TamanhoDoArquivo, NovoTamanho); free(Dados); GravaImagemProcessada("Saida.ppm", NovosDados, NovoTamanho); free(NovosDados); return 0; }
|