-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathppm.c
120 lines (108 loc) · 3.16 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
#include "ima.h"
#define INSPIREPAR "RPFELGUEIRAS"
#define CREATOR "JJ"
#define RGB_COMPONENT_COLOR 255
int ImageLoad_PPM(char *filename, Image *img)
{
char d, buff[16];
FILE *fp;
int b, c, rgb_comp_color, size, sizex, sizey;
GLubyte tmp, * ptrdeb, *ptrfin, *lastline;
//open PPM file for reading
fp = fopen(filename, "rb");
if (!fp) {
fprintf(stderr, "Unable to open file '%s'\n", filename);
exit(1);
}
//read image format
if (!fgets(buff, sizeof(buff), fp)) {
perror(filename);
exit(1);
}
//check the image format
if (buff[0] != 'P' || buff[1] != '6') {
fprintf(stderr, "Invalid image format (must be 'P6')\n");
exit(1);
}
//check for comments
c = getc(fp);
while (c == '#') {
while (getc(fp) != '\n')
;
c = getc(fp);
}
ungetc(c, fp);
//read image size information
if (fscanf(fp, "%lu %lu", &img->sizeX, &img->sizeY) != 2) {
fprintf(stderr, "Invalid image size (error loading '%s')\n", filename);
exit(1);
}
//read rgb component
if (fscanf(fp, "%d", &rgb_comp_color) != 1) {
fprintf(stderr, "Invalid rgb component (error loading '%s')\n", filename);
exit(1);
}
fscanf(fp, "%c ", &d);
//check rgb component depth
if (rgb_comp_color!= RGB_COMPONENT_COLOR) {
fprintf(stderr, "'%s' does not have 8-bits components\n", filename);
exit(1);
}
/* allocation memoire */
size = img->sizeX * img->sizeY * 3;
printf("Size image %lu %lu => %d\n", img->sizeX, img->sizeY, size);
img->data = (GLubyte *) malloc ((size_t) size * sizeof (GLubyte));
assert(img->data);
for(int j=0; j<10000; j++){
//img->data[j]=(GLubyte)0;
}
//read pixel data from file
if (fread(img->data, (size_t) 1, (size_t) size, fp) == 0) {
fprintf(stderr, "Error loading image '%s'\n", filename);
/*
exit(1);
*/
}
//printf("gegeeeeeeeee %d \n",img->data[1]);
/* remettre l image dans le bon sens */
// printf("debut %ld fin %ld\n", (int) img->data, (int) img->data + size);
sizex = img->sizeX;
sizey = img->sizeY;
lastline = img->data + size - sizex * 3;
for (b = 0; b < img->sizeY / 2; b++) {
ptrdeb = img->data + b * sizex * 3;
ptrfin = lastline - (b * sizex * 3);
// printf("%d => %ld %ld\n", b, (int) ptrdeb, (int) ptrfin);
for (c = 0; c < 3 * sizex; c++) {
tmp = *ptrdeb;
*ptrdeb = *ptrfin;
*ptrfin = tmp;
ptrfin++;
ptrdeb++;
}
}
fclose(fp);
return 1;
}
void imagesave_PPM(char *filename, Image *img)
{
FILE *fp;
//open file for output
fp = fopen(filename, "wb");
if (!fp) {
fprintf(stderr, "Unable to open file '%s'\n", filename);
exit(1);
}
//write the header file
//image format
fprintf(fp, "P6\n");
//comments
fprintf(fp, "# Created by %s\n",CREATOR);
//image size
fprintf(fp, "%lu %lu\n",img->sizeX,img->sizeY);
// rgb component depth
fprintf(fp, "%d\n",RGB_COMPONENT_COLOR);
// pixel data
fwrite(img->data, (size_t) 1, (size_t) (3 * img->sizeX * img->sizeY), fp);
fclose(fp);
}