-
Notifications
You must be signed in to change notification settings - Fork 0
/
PPM.c
250 lines (216 loc) · 6.28 KB
/
PPM.c
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/*
* File: PPM.c
* Author: flpin
*
* Created on 15 de Junho de 2018, 19:00
*/
#include <stdio.h>
#include <stdlib.h>
#include "PPM.h"
/**
* @struct color: define a strutura cor de @Pixel no formato RGB
* @param @int red
* @param @int green
* @param @int blue
*/
struct color {
int red, green, blue;
};
/**
* @typedef @Pixel define o tipo Pixel
*/
typedef struct color Pixel;
/**
* @struct @imagem define a estrutura imagem @PPM
* @param @char codificacao
* @param @int intensidade
* @param @int linhas
* @param @int colunas
* @param @Pixel p
*/
struct imagem {
char codificacao[10];
int linhas, colunas, intensidade;
Pixel ** p;
};
/**
* @typedef @PPM define o tipo de dado PPM
*/
typedef struct imagem PPM;
/**
* funcao @alocaMatrizPIxel aloca uma matriz de pixel de tamanho linhas X colunas
* @param linhas @int numeros de linhas da matriz
* @param colunas @int numero de colunas da matriz
* @return @Pixel retorna uma matriz de pixel de tamanho linhas X colunas
*/
Pixel** alocaMatrizPixel(int linhas, int colunas) {
/*declaracao de variaveis*/
Pixel ** p;
int i, j;
/*aloca a memoria para as linhas*/
p = (Pixel**) malloc(sizeof (Pixel*) * linhas);
for (i = 0; i < linhas; i++) {
/*aloca a memoria para as colunas*/
p[i] = (Pixel*) malloc(sizeof (Pixel) * colunas);
/*inicia todos os valores como zero*/
for (j = 0; j < colunas; j++) {
p[i][j].blue = 0;
p[i][j].green = 0;
p[i][j].red = 0;
}
}
/*retorna o endereco da matriz de pixel*/
return p;
}
/**
* @readPixel ler um pixel do teclado
* @param p @pixel
* @return @void
*/
void readPixel(Pixel * p) {
/*realiza a leitura*/
scanf("%d %d %d", &(*p).red, &(*p).green, &(*p).blue);
return;
}
/**
* @readPixelFile ler um pixel de um arquivo
* @param fp @FILE arquivo de onde sera lido o pixel
* @param p @Pixel pixel no qual sera armazenado a informacao
* @retrun @void
*/
void readPixelFile(FILE * fp, Pixel * p) {
/*realiza a leitura*/
fscanf(fp, "%d %d %d", &(*p).red, &(*p).green, &(*p).blue);
return;
}
/**
* @readMatrizPixelFIle ler uma matriz de pixel de um arquivo
* @param fp @FILE arquivo de onde eh realizado a leitura
* @param p @Pixel onde sera armazenado a informacao lida
* @param linhas @int numero de linhas da matriz
* @param colunas @int numero de colunas da matriz
* @return @void
*/
void readMatrizPixelFile(FILE * fp, Pixel ** p, int linhas, int colunas) {
/*declaracao de variaveis*/
int i, j;
/*realiza a leitura*/
for (i = 0; i < linhas; i++) {
for (j = 0; j < colunas; j++) {
/*ler pixel por pixel RGB*/
readPixelFile(fp, &p[i][j]);
}
}
/*retorna void*/
return;
}
/**
* @readPPMFile ler um arquivo PPM inteiro
* @param fp @FILE arquivo que sera efetuado a leitura
* @param ppm @PPM onde sera armazenado a informacao
* @retrun @void
*/
void readPPMFile(FILE * fp, PPM * ppm) {
/*ler a codificacao do arquivo*/
fscanf(fp, "%s", &(*ppm).codificacao);
/*ler o numero de linhas e colunas do arquivo*/
fscanf(fp, "%d %d",&(*ppm).colunas, &(*ppm).linhas);
/*ler a intensidade maxima do arquivo*/
fscanf(fp, "%d", &(*ppm).intensidade);
/*aloca a matriz de pixel*/
(*ppm).p = alocaMatrizPixel((*ppm).linhas, (*ppm).colunas);
/*realiza a leitura da matriz*/
readMatrizPixelFile(fp, (*ppm).p, (*ppm).linhas, (*ppm).colunas);
/*retorn void*/
return;
}
/**
* @printPixel imprime um pixel em tela
* @param p @Pixel pixel a ser impresso
*/
void printPixel(Pixel p) {
/*realiza a impressao*/
printf("%d %d %d ", (p).red, (p).green, (p).blue);
return;
}
/**
* @printPixelFile imprime um pixel em arquivo
* @param fp @file Arquivo no qual o pixel eh impresso
* @param p @Pixel pixel a ser impresso
*/
void printPixelFile(FILE * fp, Pixel p) {
/*realiza a impressao no arquivo*/
fprintf(fp, "%d %d %d ", (p).red, (p).green, (p).blue);
return;
}
/**
* @printMatrizPixel imprime uma matriz de pixel inteira na tela
* @param p @Pixel** matriz de pixel a ser impressa
* @param linhas @int numero de linhas da matriz
* @param colunas @int numer de colunas da matriz
*/
void printMatrizPixel(Pixel ** p, int linhas, int colunas) {
/*declaracao de variaveis*/
int i, j;
/*realiza a impressao em arquivo*/
for (i = 0; i < linhas; i++) {
for (j = 0; j < colunas; j++) {
printPixel(p[i][j]);
}
printf("\n");
}
return;
}
/**
* @printMatrizPixel imprime uma matriz de pixel inteira em arquivo
* @param fp @FILE arquivo no qual a matriz eh impressa
* @param p @Pixel** matriz de pixel a ser impressa
* @param linhas @int numero de linhas da matriz
* @param colunas @int numer de colunas da matriz
*/
void printMatrizPixelFile(FILE * fp, Pixel ** p, int linhas, int colunas) {
/*declaracao de variaveis*/
int i, j;
/*realiza a impressao*/
for (i = 0; i < linhas; i++) {
for (j = 0; j < colunas; j++) {
printPixelFile(fp, p[i][j]);
}
fprintf(fp, "\n");
}
return;
}
/**
* @printPPM imprime uma variavel @PPM inteira na tela
* @param ppm @PPM variavel a ser impressa
*/
void printPPM(PPM ppm) {
/*imprime a codificacao*/
printf("%s\n", (ppm).codificacao);
/*imprime o numero de linhas e colunas*/
printf("%d %d\n", (ppm).colunas,(ppm).linhas);
/*imprime a intensidade maxima*/
printf("%d\n", (ppm).intensidade);
/*imprime a matriz de pixel*/
printMatrizPixel(ppm.p, ppm.linhas, ppm. colunas);
}
/**
* @printPPMFile imprime uma variavel @PPM inteira em arquivo
* @param fp @FILE arquivo no qual sera impresso
* @param ppm @PPM variavel a ser impressa
*/
void printPPMFile(FILE * fp, PPM ppm) {
/*imprime a codificacao*/
fprintf(fp, "%s\n", (ppm).codificacao);
/*imprime o numero de linhas e colunas*/
fprintf(fp, "%d %d\n", (ppm).colunas,(ppm).linhas);
/*imprime a intensidade maxima */
fprintf(fp, "%d\n", (ppm).intensidade);
/*imprime a matriz de pixel*/
printMatrizPixelFile(fp, ppm.p, ppm.linhas, ppm. colunas);
}