-
Notifications
You must be signed in to change notification settings - Fork 1
/
pgmlib.c
81 lines (67 loc) · 1.91 KB
/
pgmlib.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
#include "pgmlib.h"
void viewPGMImage(struct pgm *pio) {
printf("Tipo: %d\n", pio->tipo);
printf("Dimensões: [%d %d]\n", pio->c, pio->r);
printf("Max: %d\n", pio->mv);
for (int k = 0; k < (pio->r * pio->c); k++) {
if (!(k % pio->c)) printf("\n");
printf("[%2hhu] ", *(pio->pData + k));
}
puts("");
}
void readPGMImage(struct pgm *pio, char *filename) {
FILE *fp;
char ch;
puts("02");
if (!(fp = fopen(filename, "r"))) {
perror("Erro.");
exit(1);
}
puts("03");
if ((ch = getc(fp)) != 'P') {
puts("A imagem fornecida não está no formato pgm");
exit(2);
}
pio->tipo = getc(fp) - 48;
fseek(fp, 1, SEEK_CUR);
while ((ch = getc(fp)) == '#') {
while ((ch = getc(fp)) != '\n');
}
fseek(fp, -1, SEEK_CUR);
fscanf(fp, "%d %d", &pio->c, &pio->r);
if (ferror(fp)) {
perror(NULL);
exit(3);
}
fscanf(fp, "%d", &pio->mv);
fseek(fp, 1, SEEK_CUR);
pio->pData = (unsigned char *)malloc(pio->r * pio->c * sizeof(unsigned char));
switch (pio->tipo) {
case 2:
puts("Lendo imagem PGM (dados em texto)");
for (int k = 0; k < (pio->r * pio->c); k++) {
fscanf(fp, "%hhu", pio->pData + k);
}
break;
case 5:
puts("Lendo imagem PGM (dados em binário)");
fread(pio->pData, sizeof(unsigned char), pio->r * pio->c, fp);
break;
default:
puts("Não está implementado");
}
fclose(fp);
}
void writePGMImage(struct pgm *pio, char *filename) {
FILE *fp;
char ch;
if (!(fp = fopen(filename, "wb"))) {
perror("Erro.");
exit(1);
}
fprintf(fp, "%s\n", "P5");
fprintf(fp, "%d %d\n", pio->c, pio->r);
fprintf(fp, "%d\n", 255);
fwrite(pio->pData, sizeof(unsigned char), pio->c * pio->r, fp);
fclose(fp);
}